-
Notifications
You must be signed in to change notification settings - Fork 2
/
parser.boson
31 lines (25 loc) · 916 Bytes
/
parser.boson
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
%parser_sparse_table yes;
%token_class_name Token;
%lexer_class_name Tokenizer;
%parser_class_name Parser;
%interpreter_class_name Interpreter;
%conflict_resolver yes;
%shift_reduce_conflict_resolver order;
%start_symbol calculator;
t_symbol = <[_a-zA-Z][_a-zA-Z0-9]*>;
t_number = <[0-9]+(\.[0-9]*)?>;
skip = <[\ \t]+>@{skip};
newline = <\r\n|\n>@{skip, newline};
calculator: statement*;
statement: t_symbol '=' expression = set_variable($0, $2)
| function
;
function: t_symbol '(' expression (',' expression)* ')' = function($0, $2, *$3[$1]);
expression: expression '^' expression = compute($0, $1, $2)
| expression ('*' | '/') expression = compute($0, *$1, $2)
| expression ('+' | '-') expression = compute($0, *$1, $2)
| '(' expression ')' = [$1]
| function
| t_symbol = get_variable($0)
| t_number = number($0)
;