-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprogram-lr.grammar
69 lines (69 loc) · 1.29 KB
/
program-lr.grammar
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
c i { } v f e l + - * / % > < g s a o q n = ; m ( ) , $ r
AG BL EA EB EL EM EX FA FD IF LP PR RT ST TE VD VL
PR
PR -> FD PR
PR -> ST PR
## Func ident(var a, var b) { print("???"); }
FD -> 'ci(' VL ')' BL
## BL the block
BL -> '{' ST '}'
## Func ident() { print("???"); }
FD -> 'ci()' BL
## Deal with argument list in (var a, var b ...)
VL -> 'vi,' VL
VL -> VL
## var a;
ST -> VD ST
VD -> 'vi;'
## if statement
ST -> IF ST
IF -> 'f(' EX ')' BL
## if (expr) { ST } else { ST }
IF -> 'f(' EX ')' BL EL
## if (expr) { ST }
EL -> 'e' BL
## while loop statement
ST -> LP ST
## while (expr) { ST }
LP -> 'l(' EX ')' BL
## return value statement
ST -> RT ST
RT -> 'r' EX ';'
## expression as statement
ST -> EA ST
## asign expression
EA -> 'i=' EX ';'
## and expression
EX -> EB 'a' EX
## or expression
EX -> EB 'o' EX
## convert to next level
EX -> EB
## >, <, <=, >=, !=, == expression
EB -> EM '<' EB
EB -> EM '>' EB
EB -> EM 'g' EB
EB -> EM 's' EB
EB -> EM 'q' EB
EB -> EM 'n' EB
## convert to next level
EB -> EM
## +- math expression
EM -> TE '-' EM
EM -> TE '+' EM
## convert to next level
EM -> TE
## */% math expression
TE -> FA '*' TE
TE -> FA '/' TE
TE -> FA '%' TE
## convert to next level
TE -> FA
## () expression
FA -> '-' FA
FA -> 'm'
FA -> '(' EX ')'
## call a function
FA -> 'i(' AG ')'
AG -> EX ',' EX
AG -> EX