-
Notifications
You must be signed in to change notification settings - Fork 2
/
grammar.bnf
278 lines (199 loc) · 9.62 KB
/
grammar.bnf
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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
//----------------------------------------------------------------------
// Main elements
//----------------------------------------------------------------------
<PROGRAM> ::= <BODY>
<BODY> ::= <DECL> | <BODY> <DECL>
<DECL> ::= <FN_DECL> | <CLASS_DECL>
//----------------------------------------------------------------------
// Class
//----------------------------------------------------------------------
<CLASS_DECL> ::= "class" <IDENT> <CLASS_BODY>
<CLASS_BODY> ::= "{" "}" | "{" <CLASS_STMTS> "}"
<CLASS_STMTS> ::= <CLASS_STMT> | <CLASS_STMTS> <CLASS_STMT>
<CLASS_STMT> ::= <METHOD_DECLS> | <FIELD_DECLS>
<METHOD_DECLS> ::= <METHOD_DECL> | <METHOD_DECLS> <METHOD_DECL>
<METHOD_DECL> ::= <CONSTRUCTOR_DECL>
| <DESTRUCTOR_DECL>
| <FN_DECL>
<CONSTRUCTOR_DECL> ::= <CONSTRUCTOR_DEF> <IDENT> <PARAMS> <STMT_BLOCK>
<DESTRUCTOR_DECL> ::= <DESTRUCTOR_DEF> <IDENT> <STMT_BLOCK>
<FIELD_DECLS> ::= <FIELD_DECL> | <FIELD_DECLS> <FIELD_DECL>
<FIELD_DECL> ::= <VAR_DECL> <STMT_END>
<CLASS_INIT> ::= "new" <IDENT> <ARGUMENTS>
<CLASS_M_CALL> ::= <CLASS_M_CALL_SINGLE>
| <CLASS_M_CALL> <CLASS_M_CALL_SYM> <CLASS_M_CALL_SINGLE>
<CLASS_M_CALL_SINGLE> ::= <IDENT> <CLASS_M_CALL_SYM> <VAR> <ARGUMENTS>
| <CLASS_M_CALL_SYM> <VAR> <ARGUMENTS>
//----------------------------------------------------------------------
// Functions
//----------------------------------------------------------------------
<FN_DECL> ::= <FN_PREAMBLE> "->" <TYPE> <STMT_BLOCK>
| <FN_PREAMBLE> <STMT_BLOCK>
<FN_PREAMBLE> ::= "fn" <IDENT> <PARAMS>
<PARAMS> ::= "(" ")" | "(" <PARAMS_SEQ> ")"
<PARAMS_SEQ> ::= <PARAM> | <PARAMS_SEQ> "," <PARAM>
<PARAM> ::= <IDENT> ":" <TYPE>
<FN_CALL> ::= <IDENT> <ARGUMENTS>
//----------------------------------------------------------------------
// Statements
//----------------------------------------------------------------------
<STMT_BLOCK> ::= "{" "}" | "{" <STMTS> "}"
<STMTS> ::= <STMT> | <STMTS> <STMT>
<STMT> ::= <FN_RETURN_STMT> <STMT_END>
| <LOOP_BREAK_STMT> <STMT_END>
| <VAR_DECL> <STMT_END>
| <ASSIGNMENT_STMT> <STMT_END>
| <EXPRESSION> <STMT_END>
| <IO_STMT> <STMT_END>
| <LOOP_STMT>
| <IF_STMT>
<FN_RETURN_STMT> ::= <RETURN_SYMB> | <RETURN_SYMB> <EXPRESSION>
<LOOP_BREAK_STMT> ::= <BREAK_SYMB> | <CONTINUE_SYMB>
<VAR_DECL> ::= <TYPE> <VAR>
| <TYPE> <VAR> "=" <EXPRESSION>
| <TYPE> <VAR> "{" <EXPRESSION> "}"
<ASSIGNMENT_STMT> ::= <VAR> {"=" | "+=" | "-=" | "*=" | "/="} <EXPRESSION>
//----------------------------------------------------------------------
// Expression statements
//----------------------------------------------------------------------
<EXPRESSION> ::= <AND_EXPR>
| <EXPRESSION> <OR_SYMB> <AND_EXPR>
<AND_EXPR> ::= <EQUAL_EXPR> | <AND_EXPR> <AND_SYMB> <EQUAL_EXPR>
<EQUAL_EXPR> ::= <COMPARE_EXPR>
| <EQUAL_EXPR> <EQUALITY_SYMB> <COMPARE_EXPR>
<COMPARE_EXPR> ::= <ADD_EXPR>
| <COMPARE_EXPR> <COMPARISON_SYMB> <ADD_EXPR>
<ADD_EXPR> ::= <MULT_EXPR> | <ADD_EXPR> <ADD_OP> <MULT_EXPR>
<MULT_EXPR> ::= <UNARY_EXPR> | <MULT_EXPR> <MULT_OP> <UNARY_EXPR>
<UNARY_EXPR> ::= <SOME_EXPR> | <UNARY_SYM> <UNARY_EXPR>
<SOME_EXPR> ::= "(" <EXPRESSION> ")"
| <VAR>
| <FN_CALL>
| <CLASS_M_CALL>
| <CONSTANT_LIT>
| <CLASS_INIT>
//----------------------------------------------------------------------
// I/O statements
//----------------------------------------------------------------------
<IO_STMT> ::= <INPUT_STMT> | <OUTPUT_STMT>
<INPUT_STMT> ::= "read" "(" <INPUT_SEQ> ")"
<OUTPUT_STMT> ::= "print" "(" <OUTPUT_SEQ> ")"
<INPUT_SEQ> ::= <VAR> | <INPUT_SEQ> "," <VAR>
<OUTPUT_SEQ> ::= <EXPRESSION> | <OUTPUT_SEQ> "," <EXPRESSION>
//----------------------------------------------------------------------
// Loop statements
//----------------------------------------------------------------------
<LOOP_STMT> ::= <WHILE_LOOP> | <FOR_LOOP> | <FOREACH_LOOP>
<WHILE_LOOP> ::= "while" "(" <EXPRESSION> ")" <STMT_BLOCK>
<FOR_LOOP> ::= "for" "(" <FOR_CONDITION> ")" <STMT_BLOCK>
<FOR_CONDITION> ::= <VAR_DECL> ";" <EXPRESSION> ";" <EXPRESSION>
<FOREACH_LOOP> ::= "for_each" "(" <FOREACH_CONDITION> ")" <STMT_BLOCK>
<FOREACH_CONDITION> ::= <VAR> "in" <EXPRESSION>
//----------------------------------------------------------------------
// If statements
//----------------------------------------------------------------------
//-----------------------.
// IF | ELIF | ELSE |
//-----------------------.
// + | | | (1)
// + | | + | (2)
// + | + | | (3)
// + | + | + | (4)
//-----------------------.
<IF_STMT> ::= <IF_BLOCK> // (1)
| <IF_BLOCK> <ELSE_BLOCK> // (2)
| <IF_BLOCK> <MULTIPLE_ELIF> // (3)
| <IF_BLOCK> <MULTIPLE_ELIF> <ELSE_BLOCK> // (4)
<IF_BLOCK> ::= "if" <IF_ELIF_COND_BODY>
<ELIF_BLOCK> ::= "elif" <IF_ELIF_COND_BODY>
<ELSE_BLOCK> ::= "else" <STMT_BLOCK>
<MULTIPLE_ELIF> ::= <ELIF_BLOCK> | <MULTIPLE_ELIF> <ELIF_BLOCK>
<IF_ELIF_COND_BODY> ::= "(" <EXPRESSION> ")" <STMT_BLOCK>
//----------------------------------------------------------------------
// Miscellaneous statements
//----------------------------------------------------------------------
<ARGUMENTS> ::= "{" "}" | "{" <EXPR_LIST> "}"
| "(" ")" | "(" <EXPR_LIST> ")"
<EXPR_LIST> ::= <EXPRESSION>
| <EXPR_LIST> "," <EXPRESSION>
//----------------------------------------------------------------------
// Identifier
//----------------------------------------------------------------------
<IDENT> ::= <IDENT_HEAD> | <IDENT> <IDENT_TAIL>
<IDENT_HEAD> ::= <LETTER> | <UNDERSCORE>
<IDENT_TAIL> ::= <LETTER> | <DIGIT> | <UNDERSCORE>
//----------------------------------------------------------------------
// Variables
//----------------------------------------------------------------------
<TYPE> ::= "void" | "int" | "bool" | "float" | "string"
<VAR> ::= <IDENT>
<CONSTANT_LIT> ::= <BOOL_CONSTANT> | <NUMERIC_CONSTANT> | <STRING>
<BOOL_CONSTANT> ::= "true" | "false"
<NUMERIC_CONSTANT> ::= <SIGN> <INTEGER>
| <SIGN> <FLOAT>
| <INTEGER>
| <FLOAT>
<INTEGER> ::= <DIGITS>
<FLOAT> ::= "." <DIGITS>
| <DIGITS> "." <DIGITS>
| <DIGITS> "." <DIGITS> <EXPONENT>
<EXPONENT> ::= "e" <EXPONENT_INT>
<EXPONENT_INT> ::= <INTEGER> | <SIGN> <INTEGER>
<DIGITS> ::= <DIGIT> <DIGITS> | <DIGIT>
//----------------------------------------------------------------------
// Strings
//----------------------------------------------------------------------
<STRING> ::= <STR_SYM> <STRING_CONTENTS> <STR_SYM>
| <STR_SYM> <STR_SYM>
<STR_SYM> ::= "\""
<STRING_CONTENTS> ::= <STRING_ITEM> | <STRING_CONTENTS> <STRING_ITEM>
<STRING_ITEM> ::= <LETTER>
| <DIGIT>
| <ASCII_WO_HASH>
| <HASH>
| <ESCAPE_SEQ>
//----------------------------------------------------------------------
// Comments
//----------------------------------------------------------------------
<COMMENT> ::= <COMMENT_SINGLE> | <COMMENT_MULTIPLE>
<COMMENT_SINGLE> ::= "//" <CMT_SYMS> <NEWLINE>
<COMMENT_MULTIPLE> ::= "/*" <CMT_SYMS> "*/" <NEWLINE>
<CMT_SYMS> ::= <CMT_SYM> | <CMT_SYMS> <CMT_SYM>
<CMT_SYM> ::= <DIGIT>
| <LETTER>
| <UNDERSCORE>
| <ASCII_WO_HASH>
//----------------------------------------------------------------------
// Symbols
//----------------------------------------------------------------------
<CONSTRUCTOR_DEF> ::= "def"
<DESTRUCTOR_DEF> ::= "rem"
<CLASS_M_CALL_SYM> ::= "." | "->"
<UNDERSCORE> ::= "_"
<STMT_END> ::= ";"
<OR_SYMB> ::= "||"
<AND_SYMB> ::= "&&"
<ADD_OP> ::= "+" | "-"
<EQUALITY_SYMB> ::= "!=" | "=="
<COMPARISON_SYMB> ::= ">" | "<" | ">=" | "<="
<UNARY_SYM> ::= "!" | "--" | "++"
<BREAK_SYMB> ::= "break"
<CONTINUE_SYMB> ::= "continue"
<RETURN_SYMB> ::= "return"
<MULT_OP> ::= "*" | "/"
<SIGN> ::= <ADD_OP>
<DIGIT> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7"
| "8" | "9"
<LETTER> ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h"
| "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p"
| "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x"
| "y" | "z" | "A" | "B" | "C" | "D" | "E" | "F"
| "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V"
| "W" | "X" | "Y" | "Z"
<ASCII_WO_HASH> ::= " " | "!" | "\"" | 36dec to 255dec in ASCII
<HASH> ::= "#"
<ESCAPE_SEQ> ::= <SLASH> <ESCAPED_SYM>
<ESCAPED_SYM> ::= "b" | "t" | "n" | "f" | "r" | "\"" | "'" | "\\"
<SLASH> ::= "\\"
//----------------------------------------------------------------------