-
Notifications
You must be signed in to change notification settings - Fork 0
/
project.y
227 lines (197 loc) · 4.2 KB
/
project.y
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
%{
#include <stdio.h>
void yyerror(const char *str){
fprintf(stderr,"error: %s\n",str);
}
int yywrap()
{
return 1;
}
int main()
{
yyparse();
}
%}
%token K_PROGRAM K_FUNCTION K_TYPE K_VAR K_IS K_RETURN K_BEGIN K_IF K_THEN K_END K_ELIF K_ELSE K_WHILE K_DO K_REPEAT K_UNTIL K_FOREACH K_PRINT K_OF K_IN /* KEYWORDS */
%token K_AND K_OR K_NOT
%token K_ARRAY K_CLASS K_EXTENDS /* TYPES */ /* integer boolean is not keyword */
%token L_NUMBER L_YES L_NO/* literal */
%token IDENT
%token P_SEMI P_DOT P_COMMA P_L_PARA P_R_PARA P_EQ P_LT P_LE P_GT P_GE P_NE P_ASSIGN P_L_BRACKET P_R_BRACKET P_ADD P_SUB P_MUL P_DIV P_MOD/* PUNCTURATIONS */
%token __DEBUG__
%%
program:
K_PROGRAM IDENT argument_list
top_defs
K_IS
variable_defs
K_BEGIN
statements
K_END;
top_defs:
|
top_defs top_def;
top_def:
function_def | type_def;
function_def:
K_FUNCTION IDENT argument_list
variable_defs /* argument_defs */
return_type_opt
K_IS
variable_defs
K_BEGIN
statements
K_END K_FUNCTION IDENT P_SEMI;
return_type_opt:
|
K_RETURN IDENT P_SEMI;
type_def:
class_def | array_def;
array_def:
K_TYPE IDENT K_IS K_ARRAY K_OF L_NUMBER IDENT P_SEMI;
class_def:
K_TYPE IDENT K_IS K_CLASS extends_opt
member_defs
K_END K_CLASS P_SEMI;
extends_opt:
|
K_EXTENDS IDENT;
member_defs:
|
member_defs member_def
;
member_def:
function_def | variable_def;
variable_defs:
|
variable_defs variable_def;
variable_def: K_VAR IDENT K_IS IDENT P_SEMI;
argument_list: /* (a, b, c) */
P_L_PARA arguments_opt P_R_PARA;
arguments_opt:
|
arguments;
arguments:
IDENT
|
arguments P_COMMA IDENT;
rel_op:
P_LT | P_LE | P_EQ | P_NE | P_GT | P_GE;
expr:
bool_term
|
expr K_OR bool_term;
bool_term:
bool_factor
|
bool_term K_AND bool_factor;
bool_factor:
bool_atom | K_NOT bool_factor;
bool_atom:
L_YES
|
L_NO
|
arith_expr
|
arith_expr rel_op arith_expr;
arith_expr:
arith_term
|
arith_expr P_ADD arith_term
|
arith_expr P_SUB arith_term;
arith_term:
arith_factor_signed
|
arith_term P_MUL arith_factor_signed
|
arith_term P_DIV arith_factor_signed
|
arith_term P_MOD arith_factor_signed;
arith_factor_signed:
arith_factor
|
P_ADD arith_factor_signed
|
P_SUB arith_factor_signed;
arith_factor:
arith_atom
|
arith_factor P_DOT IDENT /* field */
|
arith_factor P_DOT IDENT pass_value_list /* method */
|
arith_factor P_L_BRACKET expr P_R_BRACKET; /* array */
arith_atom:
L_NUMBER
|
P_L_PARA expr P_R_PARA
|
IDENT pass_value_list /* function_call */
|
IDENT /* variable */
;
pass_value_list:
P_L_PARA pass_values_opt P_R_PARA;
pass_values_opt:
| pass_values;
pass_values:
expr
|
pass_values P_COMMA expr;
statements:
|
statements statement;
statement:
assign_stat
|
if_stat
|
while_stat
|
repeat_stat
|
foreach_stat
|
return_stat
|
print_stat
|
expr P_SEMI; /* f() */
assign_stat:
expr P_ASSIGN expr P_SEMI;
if_stat:
K_IF expr K_THEN
statements
elif_branches
else_branch_opt
K_END K_IF;
elif_branches:
|
elif_branches elif_branch;
elif_branch:
K_ELIF expr K_THEN
statements;
else_branch_opt:
|
K_ELSE
statements;
while_stat:
K_WHILE expr K_DO
statements
K_END K_WHILE;
repeat_stat:
K_REPEAT
statements
K_UNTIL expr P_SEMI;
foreach_stat:
K_FOREACH IDENT K_IN expr K_DO
statements
K_END K_FOREACH;
return_stat:
K_RETURN P_SEMI
|
K_RETURN expr P_SEMI;
print_stat:
K_PRINT expr P_SEMI;