-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathreduced_grammar.txt
133 lines (96 loc) · 3.19 KB
/
reduced_grammar.txt
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
program : item_list
;
item_list : newline_opt
| item_list item terminator
;
item : pattern action
;
pattern : Begin
| End
| expr
;
action : '{' newline_opt '}'
| '{' newline_opt terminated_statement_list '}'
;
terminator : ';' newline_opt
;
terminated_statement_list : terminated_statement
| terminated_statement_list terminated_statement
;
terminated_statement : action newline_opt
| If '(' expr ')' newline_opt terminated_statement
Else newline_opt terminated_statement
| While '(' expr ')' newline_opt terminated_statement
| terminator
| terminatable_statement ';' newline_opt
;
terminatable_statement : simple_statement
| Break
| Continue
| Next
| Exit expr_opt
| Return expr_opt
| Do newline_opt terminated_statement While '(' expr ')'
;
simple_statement : expr
| print_statement
| lvalue '=' expr
;
print_statement : Print '(' expr_list ')'
;
expr_list_opt : /* empty */
| expr_list
;
expr_list : expr
| multiple_expr_list
;
multiple_expr_list : expr ',' newline_opt expr
| multiple_expr_list ',' newline_opt expr
;
expr_opt : /* empty */
| expr
;
expr : unary_expr
| non_unary_expr
| binary_expr
| literal_expr
;
unary_expr : '+' expr
| '-' expr
| '!' expr
;
binary_expr : expr '^' expr
| expr '*' expr
| expr '/' expr
| expr '%' expr
| expr '+' expr
| expr '-' expr
| expr non_unary_expr
| expr '˜' expr
| expr NO_MATCH expr
| expr AND newline_opt expr
| expr OR newline_opt expr
| expr '?' expr ':' expr
| expr '<' expr
| expr LE expr
| expr NE expr
| expr EQ expr
| expr '>' expr
| expr GE expr
;
non_unary_expr : '(' expr ')'
| '(' multiple_expr_list ')' In NAME
| lvalue
| BUILTIN_FUNC_NAME '(' expr_list_opt ')'
| BUILTIN_FUNC_NAME
;
literal_expr : NUMBER
| STRING
| ERE
;
lvalue : NAME
| '$' expr
;
newline_opt : /* empty */
| newline_opt NEWLINE
;