]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.common/src/expression.sablecc3
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.spreadsheet.common / src / expression.sablecc3
1 Package org.simantics.spreadsheet.common.expression;
2
3 Helpers
4   letter = [['A'..'Z'] + ['a'..'z']];
5   digit = ['0'..'9'];
6   cr = 13;
7   lf = 10;
8   not_cr_lf = [[32..127] - [cr + lf]];
9   
10   harmless_char = [[32..127] - [''' + ['"' + '\']]];
11
12   sq_str_char = harmless_char | '"';
13   dq_str_char = harmless_char | ''';
14
15   sq_str_char_sequence = sq_str_char+;
16   dq_str_char_sequence = dq_str_char+;
17
18   single_quote_string = ''' sq_str_char_sequence? ''';
19   double_quote_string = '"' dq_str_char_sequence? '"';
20  
21 Tokens
22   less_than = '<';
23   greater_than = '>';
24   equal = '=';
25
26   plus = '+';
27   minus = '-';
28   mult = '*';
29   div = '/';
30   ampersand = '&';
31
32   comma = ',';
33   colon = ':';
34   
35   l_par = '(';
36   r_par = ')';
37
38   func = letter (letter | digit)* '(';
39   cell = '_'? letter+ digit+;
40   number = digit+ '.'* digit*;
41   string = single_quote_string | double_quote_string;  
42
43   new_line = cr | lf | cr lf;
44
45   blank = ' '*;
46
47 Ignored Tokens
48   blank;
49
50 Productions
51
52   expression =
53     {mult} multiplicative |
54     {plus} [left]:expression plus [right]:multiplicative |
55         {minus} expression minus multiplicative;
56
57   multiplicative =
58     {unary} unary |
59         {mult} [left]:multiplicative mult [right]:unary |
60         {div} [left]:multiplicative div [right]:unary;
61
62   unary =
63         {primary} primary |
64         {unaryplus} plus unary |
65         {unaryminus} minus unary;
66
67   arg_list = 
68     {single} expression |
69     {sequence} arg_list comma expression;
70
71   primary =     
72         {value} value |
73     {function} func arg_list? r_par;
74         
75   range =
76     {single} cell |
77     {multi} [left]:cell colon [right]:cell;
78         
79   value =
80     {string} string |
81     {constant} number |
82     {range} range |
83     {address} ampersand range |
84     {expr} l_par expression r_par;