grammar Delorean rule line f:formula sp? ('#' .*)? end rule formula sp4 i:identifier sp? '=?' sp? e:expression / sp4 i:identifier sp? '=?' / sp4 i:identifier sp? '=' sp? e:expression / n:class_name ':' sp? mod:(m:class_name '::')? p:class_name / n:class_name ':' / 'import' sp n:class_name end rule class_name [A-Z] [a-zA-Z0-9_]* end rule expression 'ERR(' sp? args:fn_args sp? ')' / op:unary_op sp? e:expression / 'if' sp? v:expression sp? 'then' sp? e1:expression sp? 'else' sp? e2:expression / v:getattr_exp sp? op:binary_op sp? e:expression / getattr_exp end rule getattr_exp v:value dotted:dotted / value end rule dotted d:dot_exp d_rest:dotted? end rule dot_exp '[' sp? args:fn_args sp? ']' / '(' sp? al:kw_args? sp? ')' / '.' sp? i:identifier '(' sp? al:kw_args? sp? ')' / '.' sp? i:identifier end rule list_expr '[]' / '[' sp? e2:expression sp 'for' sp i:identifier sp 'in' sp e1:expression sp? ifexp:('if' sp e3:expression sp?)? ']' / '[' sp? args:fn_args sp? ']' end rule set_expr '{-}' / '{' sp? e2:expression sp 'for' sp i:identifier sp 'in' sp e1:expression sp? ifexp:('if' sp e3:expression sp?)? '}' / '{' sp? args:fn_args sp? '}' end rule hash_expr '{}' / '{' sp? el:expression sp? ':' sp? er:expression sp 'for' sp i:identifier sp 'in' sp e1:expression sp? ifexp:('if' sp ei:expression sp?)? '}' / '{' sp? args:hash_args sp? '}' end # NOTE: some operations such as << have side-effects (e.g. on # Arrays). So, be cautious about which opertaions are added. rule binary_op '==' / '!=' / '>=' / '<=' / '&&' / '||' / '>' / '<' / '+' / '-' / '*' / '/' / '%' / '&' / '^' / '|' end rule unary_op '!' / '-' end rule value number / string / boolean / nil_val / identifier / list_expr / set_expr / hash_expr / mod:(m:class_name '::')? c:class_name / '(' sp? e:expression sp? ')' end rule fn_args arg0:expression args_rest:(sp? ',' sp? args:fn_args?)? end rule hash_args e0:expression sp? ':' sp? e1:expression args_rest:(sp? ',' sp? al:hash_args?)? end rule kw_args k:(i:identifier sp? '=' sp?)? arg0:expression args_rest:(sp? ',' sp? al:kw_args?)? end rule number decimal / integer end rule decimal [0-9]+ '.' [0-9]+ end rule integer [0-9]+ end rule identifier [a-z] [a-zA-Z0-9_]* end rule boolean 'true' / 'false' end rule nil_val 'nil' end # and you thought python was anal about spaces? rule sp4 ' ' end rule sp [\s]+ end rule string '"' ('\"' / !'"' .)* '"' / "'" [^']* "'" end end