Skip to content

Instantly share code, notes, and snippets.

@tj
Created March 11, 2009 22:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tj/77783 to your computer and use it in GitHub Desktop.
Save tj/77783 to your computer and use it in GitHub Desktop.
%%{
machine ruby;
alpha_u = alpha | '_';
alnum_u = alnum | '_';
boundary = ^(alnum_u | '.');
newline = '\r'? '\n';
consume_line = any* :>> newline;
id = alpha_u (alnum_u)*;
constant = upper id?;
comment = '#' consume_line;
string = '"' any* :>> '"' | "'" any* :>> "'" | '%(' any* :>> ')';
symbol = ':' (id | constant | string);
namespace = constant ('::' constant)*;
self = 'self';
int = digit (digit | '_')*;
float = int '.' int;
inclusive_range = int '..' int;
exclusive_range = int '...' int;
range = inclusive_range | exclusive_range;
array = '%w(' any* :>> ')';
global_var = '$' any+ boundary;
class_var = '@@' id;
inst_var = '@' id;
shell = '%x{' any* :>> '}' | '`' any* :>> '`';
regexp = ('%r{' any* :>> '}' | '/' any* :>> '/') alpha*;
params = '|' any* :>> '|';
end = '__END__';
keyword = boundary ( 'if' | 'else' | 'elsif' | 'unless' | 'retry' | 'super' |
'then' | 'true' | 'while' | 'until' | 'class' | 'module' |
'defined' | 'end' | 'in' | 'alias' | 'and' | 'redo' |
'break' | 'def' | 'do' | 'nil' | 'not' | 'or' |
'rescue' | 'return' | 'yield' | 'begin' | 'BEGIN' | 'END' ) boundary;
main := |*
comment => { NODE("comment") };
string => { NODE("string") };
array => { NODE("array") };
regexp => { NODE("regexp") };
symbol => { NODE("symbol") };
shell => { NODE("shell") };
int => { NODE("int") };
float => { NODE("float") };
range => { NODE("range") };
self => { NODE("self") };
keyword => { NODE("keyword") };
namespace => { NODE("namespace") };
params => { NODE("params") };
class_var => { NODE("class_var") };
inst_var => { NODE("inst_var") };
global_var => { NODE("gloal_var") };
any => { NODE("any") };
*|;
}%%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment