Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.basicexpression / src / expression.sablecc3
1 Package org.simantics.basicexpression;
2
3 Helpers
4   letter = [[['A'..'Z'] + ['a'..'z']] + '_'];
5   digit = ['0'..'9'];
6   cr = 13;
7   lf = 10;
8   not_cr_lf = [[32..255] - [cr + lf]];
9   
10   harmless_char = [[32..255] - [''' + ['"' + '\']]];
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   variable = letter (letter | digit)*;
39   func = letter (letter | digit)* '(';
40   cell = '_'? letter+ digit+;
41   rvi = ('.')* ('/' | '#') ('/' | '#' | '.' | letter | digit | '_')*;
42   number = digit+ '.'* digit*;
43   string = single_quote_string | double_quote_string;  
44
45   new_line = cr | lf | cr lf;
46
47   blank = ' '*;
48
49 Ignored Tokens
50   blank;
51
52 Productions
53
54   expression =
55     {mult} multiplicative |
56     {plus} [left]:expression plus [right]:multiplicative |
57         {minus} expression minus multiplicative;
58
59   multiplicative =
60     {unary} unary |
61         {mult} [left]:multiplicative mult [right]:unary |
62         {div} [left]:multiplicative div [right]:unary;
63
64   unary =
65         {primary} primary |
66         {unaryplus} plus unary |
67         {unaryminus} minus unary;
68
69   arg_list = 
70     {single} expression |
71     {sequence} arg_list comma expression;
72
73   primary =     
74         {value} value |
75         {variable} variable |
76     {function} func arg_list? r_par;
77         
78   range =
79     {single} cell |
80     {multi} [left]:cell colon [right]:cell;
81         
82   value =
83     {rvi} rvi |
84     {string} string |
85     {constant} number |
86     {range} range |
87     {address} ampersand range |
88     {expr} l_par expression r_par;