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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
Nonterminals
root
statement
statements
expr
exprs
.
Terminals
int
var
break
'+' '-' '*' '/' '!'
'='
'(' ')'
.
Rootsymbol
root
.
Right 100 '='.
Left 300 '+'.
Left 300 '-'.
Left 400 '*'.
Left 400 '/'.
Right 500 '!'.
Left 600 '('.
root -> statements : '$1'.
statements -> statement : ['$1'].
statements -> statement statements : ['$1'|'$2'].
statements -> statement break statements : ['$1'|'$3'].
statements -> break : [].
statement -> var '=' exprs : {assign, '$1', '$3'}.
statement -> exprs : {eval, '$1'}.
exprs -> expr : '$1'.
exprs -> expr exprs : {mul_op, '$1', '$2'}.
expr -> int : unwrap('$1').
expr -> var : '$1'.
expr -> exprs '+' exprs : {add_op, '$1', '$3'}.
expr -> exprs '-' exprs : {sub_op, '$1', '$3'}.
expr -> exprs '*' exprs : {mul_op, '$1', '$3'}.
expr -> exprs '/' exprs : {div_op, '$1', '$3'}.
expr -> '(' exprs ')' : '$2'.
expr -> expr '!' : {factor_op, '$1'}.
Erlang code.
unwrap({int, Line, Value}) -> {int, Line, list_to_integer(Value)}.
|