@@ -171,17 +171,56 @@ void yyerror(YYLTYPE *yyloc, LFortran::Parser &p, const std::string &msg)
171
171
172
172
// Nonterminal tokens
173
173
174
+ %type <ast> script_unit
175
+ %type <ast> id
174
176
%type <ast> expr
177
+ %type <vec_ast> expr_list
178
+ /* %type <vec_ast> expr_list_opt */
179
+ %type <ast> statement
180
+ %type <ast> single_line_statement
181
+ /* %type <ast> multi_line_statement */
182
+ %type <ast> augassign_statement
183
+ %type <operator_type> augassign_op
184
+ %type <ast> pass_statement
185
+ %type <ast> continue_statement
186
+ %type <ast> break_statement
187
+ %type <ast> raise_statement
188
+ %type <ast> assert_statement
189
+ %type <ast> import_statement
190
+ %type <ast> global_statement
191
+ %type <ast> nonlocal_statement
192
+ %type <ast> assignment_statement
193
+ %type <vec_ast> target_list
194
+ %type <vec_ast> target_item_list
195
+ %type <ast> target_item
196
+ %type <ast> target
197
+ %type <ast> ann_assignment_statement
198
+ %type <ast> delete_statement
199
+ %type <ast> del_target
200
+ %type <vec_ast> del_target_list
201
+ %type <ast> return_statement
202
+ /*
203
+ %type <ast> expression_statment
204
+ */
205
+ %type <vec_ast> module
206
+ %type <alias> module_as_id
207
+ %type <vec_alias> module_item_list
208
+ %type <vec_ast> sep
209
+ %type <ast> sep_one
175
210
176
211
// Precedence
177
212
178
213
// %left "or"
179
214
// %left "and"
180
215
// %precedence "not"
181
- // %left "==" "/=" "<" "<=" ">" ">="
216
+ %left " ==" " !=" " >=" " >" " <=" " <" //" is not" " is" " not in" " in"
217
+ %left " |"
218
+ %left " ^"
219
+ %left " &"
220
+ %left " >>" " <<"
182
221
%left " -" " +"
183
- %left " * " " /"
184
- // %precedence UMINUS
222
+ %left " % " " // " " / " " @ " " * "
223
+ %precedence UNARY
185
224
%right " **"
186
225
187
226
%start units
@@ -198,21 +237,244 @@ void yyerror(YYLTYPE *yyloc, LFortran::Parser &p, const std::string &msg)
198
237
// Higher %dprec means higher precedence
199
238
200
239
units
201
- : expr TK_NEWLINE { RESULT($1); }
240
+ : units script_unit { RESULT($2); }
241
+ | script_unit { RESULT($1); }
242
+ | sep
243
+ ;
244
+
245
+ script_unit
246
+ : statement sep { $$ = SCRIPT_UNIT_STMT($1); }
247
+ | expr sep { $$ = SCRIPT_UNIT_EXPR($1); }
248
+ ;
249
+ /*
250
+ statements
251
+ : single_stmt_list TK_NEWLINE { }
252
+ | sep TK_INDENT statements1 TK_DEDENT { }
253
+ ;
254
+
255
+ statements1
256
+ : statements1 statement sep { }
257
+ | statement sep { }
258
+ ;
259
+
260
+ single_stmt_list
261
+ : single_stmt_list ";" single_line_statement { }
262
+ | single_line_statement { }
263
+ ;
264
+ */
265
+ statement
266
+ : single_line_statement
267
+ /* | multi_line_statement */
268
+ ;
269
+
270
+ single_line_statement
271
+ /* : expression_statment */
272
+ : assert_statement
273
+ | assignment_statement
274
+ | augassign_statement
275
+ | ann_assignment_statement
276
+ | pass_statement
277
+ | delete_statement
278
+ | return_statement
279
+ | raise_statement
280
+ | break_statement
281
+ | continue_statement
282
+ | import_statement
283
+ | global_statement
284
+ | nonlocal_statement
285
+ ;
286
+
287
+ pass_statement
288
+ : KW_PASS { $$ = PASS(@$); }
289
+ ;
290
+
291
+ break_statement
292
+ : KW_BREAK { $$ = BREAK(@$); }
293
+ ;
294
+
295
+ continue_statement
296
+ : KW_CONTINUE { $$ = CONTINUE(@$); }
297
+ ;
298
+
299
+ raise_statement
300
+ : KW_RAISE { $$ = RAISE_01(@$); }
301
+ | KW_RAISE expr { $$ = RAISE_02($2, @$); }
302
+ | KW_RAISE expr KW_FROM expr { $$ = RAISE_03($2, $4, @$); }
303
+ ;
304
+
305
+ assert_statement
306
+ : KW_ASSERT expr { $$ = ASSERT_01($2, @$); }
307
+ | KW_ASSERT expr "," expr { $$ = ASSERT_02($2, $4, @$); }
308
+ ;
309
+
310
+ target
311
+ : id { $$ = TARGET_ID($1, @$); }
312
+ | expr "." id { }
313
+ | expr "[" expr_list "]" { }
314
+ ;
315
+
316
+ target_item_list
317
+ : target_item_list "," target { $$ = $1; LIST_ADD($$, $3); }
318
+ | target { LIST_NEW($$); LIST_ADD($$, $1); }
319
+ ;
320
+
321
+ target_item
322
+ : target_item_list { $$ = TUPLE_01($1, @$); }
323
+ ;
324
+
325
+ target_list
326
+ : target_list target_item "=" { $$ = $1; LIST_ADD($$, $2); }
327
+ | target_item "=" { LIST_NEW($$); LIST_ADD($$, $1); }
328
+ ;
329
+
330
+ assignment_statement
331
+ : target_list expr { $$ = ASSIGNMENT($1, $2, @$); }
332
+ ;
333
+
334
+ augassign_statement
335
+ : target augassign_op expr { $$ = AUGASSIGN_01($1, $2, $3, @$); }
336
+ ;
337
+
338
+ augassign_op
339
+ : "+=" { $$ = OPERATOR(Add, @$); }
340
+ | "-=" { $$ = OPERATOR(Sub, @$); }
341
+ | "*=" { $$ = OPERATOR(Mult, @$); }
342
+ | "/=" { $$ = OPERATOR(Div, @$); }
343
+ | "%=" { $$ = OPERATOR(Mod, @$); }
344
+ | "&=" { $$ = OPERATOR(BitAnd, @$); }
345
+ | "|=" { $$ = OPERATOR(BitOr, @$); }
346
+ | "^=" { $$ = OPERATOR(BitXor, @$); }
347
+ | "<<=" { $$ = OPERATOR(LShift, @$); }
348
+ | ">>=" { $$ = OPERATOR(RShift, @$); }
349
+ | "**=" { $$ = OPERATOR(Pow, @$); }
350
+ | "//=" { $$ = OPERATOR(FloorDiv, @$); }
351
+ ;
352
+
353
+ ann_assignment_statement
354
+ : target ":" expr { $$ = ANNASSIGN_01($1, $3, @$); }
355
+ | target ":" expr "=" expr { $$ = ANNASSIGN_02($1, $3, $5, @$); }
356
+ ;
357
+
358
+ del_target
359
+ : id { $$ = DEL_TARGET_ID($1, @$); }
360
+ ;
361
+
362
+ del_target_list
363
+ : del_target_list "," del_target { $$ = $1; LIST_ADD($$, $3); }
364
+ | del_target { LIST_NEW($$); LIST_ADD($$, $1); }
365
+ ;
366
+
367
+ delete_statement
368
+ : KW_DEL del_target_list { $$ = DELETE($2, @$); }
369
+ ;
370
+
371
+ return_statement
372
+ : KW_RETURN { $$ = RETURN_01(@$); }
373
+ | KW_RETURN expr { $$ = RETURN_02($2, @$); }
374
+ ;
375
+
376
+ module
377
+ : module "." id { $$ = $1; LIST_ADD($$, $3); }
378
+ | id { LIST_NEW($$); LIST_ADD($$, $1); }
379
+ ;
380
+
381
+ module_as_id
382
+ : module { $$ = MOD_ID_01($1, @$); }
383
+ | module KW_AS id { $$ = MOD_ID_02($1, $3, @$); }
384
+ | "*" { $$ = MOD_ID_03("*", @$); }
385
+ ;
386
+
387
+ module_item_list
388
+ : module_item_list "," module_as_id { $$ = $1; PLIST_ADD($$, $3); }
389
+ | module_as_id { LIST_NEW($$); PLIST_ADD($$, $1); }
390
+ ;
391
+
392
+ dot_list
393
+ : dot_list "." { DOT_COUNT_01(); }
394
+ | "." { DOT_COUNT_01(); }
395
+ | dot_list "..." { DOT_COUNT_02(); }
396
+ | "..." { DOT_COUNT_02(); }
397
+ ;
398
+
399
+ import_statement
400
+ : KW_IMPORT module_item_list { $$ = IMPORT_01($2, @$); }
401
+ | KW_FROM module KW_IMPORT module_item_list {
402
+ $$ = IMPORT_02($2, $4, @$); }
403
+ | KW_FROM module KW_IMPORT "(" module_item_list ")" {
404
+ $$ = IMPORT_02($2, $5, @$); }
405
+ | KW_FROM dot_list KW_IMPORT module_item_list {
406
+ $$ = IMPORT_03($4, @$); }
407
+ | KW_FROM dot_list module KW_IMPORT module_item_list {
408
+ $$ = IMPORT_04($3, $5, @$); }
409
+ | KW_FROM dot_list KW_IMPORT "(" module_item_list ")" {
410
+ $$ = IMPORT_03($5, @$); }
411
+ | KW_FROM dot_list module KW_IMPORT "(" module_item_list ")" {
412
+ $$ = IMPORT_04($3, $6, @$); }
413
+ ;
414
+
415
+ global_statement
416
+ : KW_GLOBAL expr_list { $$ = GLOBAL($2, @$); }
417
+ ;
418
+
419
+ nonlocal_statement
420
+ : KW_NONLOCAL expr_list { $$ = NON_LOCAL($2, @$); }
421
+ ;
422
+
423
+ expr_list
424
+ : expr_list "," expr { $$ = $1; LIST_ADD($$, $3); }
425
+ | expr { LIST_NEW($$); LIST_ADD($$, $1); }
202
426
;
203
427
204
428
expr
205
- // ### primary
206
- : TK_NAME { $$ = SYMBOL($1, @$); }
429
+ : id { $$ = $1; }
207
430
| TK_INTEGER { $$ = INTEGER($1, @$); }
431
+ | TK_STRING { $$ = STRING($1, @$); }
432
+ | TK_REAL { $$ = FLOAT($1, @$); }
433
+ | TK_IMAG_NUM { $$ = COMPLEX($1, @$); }
434
+ | TK_TRUE { $$ = BOOL(true, @$); }
435
+ | TK_FALSE { $$ = BOOL(false, @$); }
208
436
| "(" expr ")" { $$ = $2; }
437
+ | id "(" ")" { $$ = CALL_01($1, @$); }
438
+ | id "(" expr_list ")" { $$ = CALL_02($1, $3, @$); }
439
+
440
+ | expr "+" expr { $$ = BINOP($1, Add, $3, @$); }
441
+ | expr "-" expr { $$ = BINOP($1, Sub, $3, @$); }
442
+ | expr "*" expr { $$ = BINOP($1, Mult, $3, @$); }
443
+ | expr "/" expr { $$ = BINOP($1, Div, $3, @$); }
444
+ | expr "%" expr { $$ = BINOP($1, Mod, $3, @$); }
445
+ | "-" expr %prec UNARY { $$ = UNARY($2, USub, @$); }
446
+ | "+" expr %prec UNARY { $$ = UNARY($2, UAdd, @$); }
447
+ | "~" expr %prec UNARY { $$ = UNARY($2, Invert, @$); }
448
+ | expr "**" expr { $$ = BINOP($1, Pow, $3, @$); }
449
+ | expr "//" expr { $$ = BINOP($1, FloorDiv, $3, @$); }
450
+ | expr "@" expr { $$ = BINOP($1, MatMult, $3, @$); }
451
+
452
+ | expr "&" expr { $$ = BINOP($1, BitAnd, $3, @$); }
453
+ | expr "|" expr { $$ = BINOP($1, BitOr, $3, @$); }
454
+ | expr "^" expr { $$ = BINOP($1, BitXor, $3, @$); }
455
+ | expr "<<" expr { $$ = BINOP($1, LShift, $3, @$); }
456
+ | expr ">>" expr { $$ = BINOP($1, RShift, $3, @$); }
457
+
458
+ | expr "==" expr { $$ = COMPARE($1, Eq, $3, @$); }
459
+ | expr "!=" expr { $$ = COMPARE($1, NotEq, $3, @$); }
460
+ | expr "<" expr { $$ = COMPARE($1, Lt, $3, @$); }
461
+ | expr "<=" expr { $$ = COMPARE($1, LtE, $3, @$); }
462
+ | expr ">" expr { $$ = COMPARE($1, Gt, $3, @$); }
463
+ | expr ">=" expr { $$ = COMPARE($1, GtE, $3, @$); }
464
+ ;
209
465
466
+ id
467
+ : TK_NAME { $$ = SYMBOL($1, @$); }
468
+ ;
210
469
211
- // ### level-2
212
- | expr "+" expr { $$ = ADD($1, $3, @$); }
213
- | expr "-" expr { $$ = SUB($1, $3, @$); }
214
- | expr "*" expr { $$ = MUL($1, $3, @$); }
215
- | expr "/" expr { $$ = DIV($1, $3, @$); }
216
- | expr "**" expr { $$ = POW($1, $3, @$); }
470
+ sep
471
+ : sep sep_one { $$ = $1; LIST_ADD($$, $2); }
472
+ | sep_one { LIST_NEW($$); LIST_ADD($$, $1); }
473
+ ;
217
474
475
+ sep_one
476
+ : TK_NEWLINE {}
477
+ | TK_COMMENT {}
478
+ | TK_EOLCOMMENT {}
479
+ | ";" {}
218
480
;
0 commit comments