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