Skip to content

Commit 27b8989

Browse files
authored
Merge pull request #349 from Thirumalai-Shaktivel/parser1
[Parser] Initial implementation of Statements
2 parents 9ac009e + 2fdf859 commit 27b8989

14 files changed

+588
-38
lines changed

run_tests.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def main():
4242
ast_cpp = test.get("ast_cpp", False)
4343
ast_cpp_hip = test.get("ast_cpp_hip", False)
4444
ast_openmp = test.get("ast_openmp", False)
45+
ast_new = test.get("ast_new", False)
4546
asr = test.get("asr", False)
4647
asr_preprocess = test.get("asr_preprocess", False)
4748
asr_indent = test.get("asr_indent", False)
@@ -63,6 +64,10 @@ def main():
6364
run_test("ast", "lpython --show-ast --no-color {infile} -o {outfile}",
6465
filename, update_reference, extra_args)
6566

67+
if ast_new:
68+
run_test("ast_new", "lpython --show-ast --new-parser --no-color {infile} -o {outfile}",
69+
filename, update_reference, extra_args)
70+
6671
if asr:
6772
run_test("asr", "lpython --show-asr --no-color {infile} -o {outfile}",
6873
filename, update_reference, extra_args)

src/lpython/parser/parser.yy

Lines changed: 274 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -171,17 +171,56 @@ void yyerror(YYLTYPE *yyloc, LFortran::Parser &p, const std::string &msg)
171171

172172
// Nonterminal tokens
173173

174+
%type <ast> script_unit
175+
%type <ast> id
174176
%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
175210

176211
// Precedence
177212

178213
//%left "or"
179214
//%left "and"
180215
//%precedence "not"
181-
//%left "==" "/=" "<" "<=" ">" ">="
216+
%left "==" "!=" ">=" ">" "<=" "<" //"is not" "is" "not in" "in"
217+
%left "|"
218+
%left "^"
219+
%left "&"
220+
%left ">>" "<<"
182221
%left "-" "+"
183-
%left "*" "/"
184-
//%precedence UMINUS
222+
%left "%" "//" "/" "@" "*"
223+
%precedence UNARY
185224
%right "**"
186225

187226
%start units
@@ -198,21 +237,244 @@ void yyerror(YYLTYPE *yyloc, LFortran::Parser &p, const std::string &msg)
198237
// Higher %dprec means higher precedence
199238

200239
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); }
202426
;
203427

204428
expr
205-
// ### primary
206-
: TK_NAME { $$ = SYMBOL($1, @$); }
429+
: id { $$ = $1; }
207430
| 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, @$); }
208436
| "(" 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+
;
209465

466+
id
467+
: TK_NAME { $$ = SYMBOL($1, @$); }
468+
;
210469

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+
;
217474

475+
sep_one
476+
: TK_NEWLINE {}
477+
| TK_COMMENT {}
478+
| TK_EOLCOMMENT {}
479+
| ";" {}
218480
;

src/lpython/parser/parser_stype.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ union YYSTYPE {
2222

2323
LPython::AST::ast_t* ast;
2424
Vec<LPython::AST::ast_t*> vec_ast;
25+
26+
LPython::AST::alias_t* alias;
27+
Vec<LPython::AST::alias_t> vec_alias;
28+
29+
LPython::AST::operatorType operator_type;
2530
};
2631

2732
static_assert(std::is_standard_layout<YYSTYPE>::value);

0 commit comments

Comments
 (0)