--- /dev/null
+Package org.simantics.basicexpression;\r
+\r
+Helpers\r
+ letter = [[['A'..'Z'] + ['a'..'z']] + '_'];\r
+ digit = ['0'..'9'];\r
+ cr = 13;\r
+ lf = 10;\r
+ not_cr_lf = [[32..255] - [cr + lf]];\r
+ \r
+ harmless_char = [[32..255] - [''' + ['"' + '\']]];\r
+\r
+ sq_str_char = harmless_char | '"';\r
+ dq_str_char = harmless_char | ''';\r
+\r
+ sq_str_char_sequence = sq_str_char+;\r
+ dq_str_char_sequence = dq_str_char+;\r
+\r
+ single_quote_string = ''' sq_str_char_sequence? ''';\r
+ double_quote_string = '"' dq_str_char_sequence? '"';\r
+ \r
+Tokens\r
+ less_than = '<';\r
+ greater_than = '>';\r
+ equal = '=';\r
+\r
+ plus = '+';\r
+ minus = '-';\r
+ mult = '*';\r
+ div = '/';\r
+ ampersand = '&';\r
+\r
+ comma = ',';\r
+ colon = ':';\r
+ \r
+ l_par = '(';\r
+ r_par = ')';\r
+\r
+ variable = letter (letter | digit)*;\r
+ func = letter (letter | digit)* '(';\r
+ cell = '_'? letter+ digit+;\r
+ rvi = ('.')* ('/' | '#') ('/' | '#' | '.' | letter | digit | '_')*;\r
+ number = digit+ '.'* digit*;\r
+ string = single_quote_string | double_quote_string; \r
+\r
+ new_line = cr | lf | cr lf;\r
+\r
+ blank = ' '*;\r
+\r
+Ignored Tokens\r
+ blank;\r
+\r
+Productions\r
+\r
+ expression =\r
+ {mult} multiplicative |\r
+ {plus} [left]:expression plus [right]:multiplicative |\r
+ {minus} expression minus multiplicative;\r
+\r
+ multiplicative =\r
+ {unary} unary |\r
+ {mult} [left]:multiplicative mult [right]:unary |\r
+ {div} [left]:multiplicative div [right]:unary;\r
+\r
+ unary =\r
+ {primary} primary |\r
+ {unaryplus} plus unary |\r
+ {unaryminus} minus unary;\r
+\r
+ arg_list = \r
+ {single} expression |\r
+ {sequence} arg_list comma expression;\r
+\r
+ primary = \r
+ {value} value |\r
+ {variable} variable |\r
+ {function} func arg_list? r_par;\r
+ \r
+ range =\r
+ {single} cell |\r
+ {multi} [left]:cell colon [right]:cell;\r
+ \r
+ value =\r
+ {rvi} rvi |\r
+ {string} string |\r
+ {constant} number |\r
+ {range} range |\r
+ {address} ampersand range |\r
+ {expr} l_par expression r_par;\r