Package org.simantics.spreadsheet.common.expression; Helpers letter = [['A'..'Z'] + ['a'..'z']]; digit = ['0'..'9']; cr = 13; lf = 10; not_cr_lf = [[32..127] - [cr + lf]]; harmless_char = [[32..127] - [''' + ['"' + '\']]]; 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 = ')'; func = letter (letter | digit)* '('; cell = '_'? 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 | {function} func arg_list? r_par; range = {single} cell | {multi} [left]:cell colon [right]:cell; value = {string} string | {constant} number | {range} range | {address} ampersand range | {expr} l_par expression r_par;