Skip to content

Commit 6d29003

Browse files
Merge pull request #854 from Thirumalai-Shaktivel/func_def_02
2 parents b82d617 + 8ee9178 commit 6d29003

File tree

6 files changed

+212
-143
lines changed

6 files changed

+212
-143
lines changed

src/lpython/parser/parser.yy

Lines changed: 35 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ void yyerror(YYLTYPE *yyloc, LFortran::Parser &p, const std::string &msg)
216216
%type <ast> function_def
217217
%type <args> parameter_list_opt
218218
%type <arg> parameter
219-
%type <args> parameter_list_starargs
219+
%type <fn_arg> parameter_list
220+
%type <args_> parameter_list_no_posonly
221+
%type <var_kw> parameter_list_starargs
220222
%type <vec_arg> defparameter_list
221223
%type <vec_ast> decorators
222224
%type <vec_ast> decorators_opt
@@ -577,62 +579,43 @@ defparameter_list
577579
| parameter { LIST_NEW($$); LIST_ADD($$, $1); }
578580
| defparameter_list "," TK_TYPE_COMMENT parameter { $$ = $1;
579581
LIST_ADD($$, $4); ADD_TYPE_COMMENT($1, $3, @$); }
582+
| defparameter_list "," TK_TYPE_COMMENT {
583+
$$ = $1; ADD_TYPE_COMMENT($1, $3, @$); }
584+
;
585+
586+
parameter_list
587+
: defparameter_list "," "/" comma_opt {
588+
$$ = PARAMETER_LIST_01($1, nullptr); }
589+
| defparameter_list "," "/" "," parameter_list_no_posonly {
590+
$$ = PARAMETER_LIST_01($1, $5); }
591+
| parameter_list_no_posonly { $$ = PARAMETER_LIST_02($1); }
592+
;
593+
594+
parameter_list_no_posonly
595+
: defparameter_list comma_opt { $$ = PARAMETER_LIST_03($1, nullptr); }
596+
| defparameter_list "," parameter_list_starargs {
597+
$$ = PARAMETER_LIST_03($1, $3); }
598+
| parameter_list_starargs { $$ = PARAMETER_LIST_04($1); }
580599
;
581600

582601
parameter_list_starargs
583-
: "*" parameter { $$ = STAR_ARGS_01($2, @$); }
584-
| "*" parameter "," defparameter_list { $$ = STAR_ARGS_02($2, $4, @$); }
585-
| "*" parameter "," defparameter_list "," "**" parameter {
586-
$$ = STAR_ARGS_03($2, $4, $7, @$); }
587-
| "*" parameter "," "**" parameter { $$ = STAR_ARGS_04($2, $5, @$); }
588-
| "**" parameter { $$ = STAR_ARGS_05($2, @$); }
589-
590-
| defparameter_list "," "*" parameter { $$ = STAR_ARGS_06($1, $4, @$); }
591-
| defparameter_list "," "*" parameter "," defparameter_list {
592-
$$ = STAR_ARGS_07($1, $4, $6, @$); }
593-
| defparameter_list "," "*" parameter "," defparameter_list "," "**" parameter {
594-
$$ = STAR_ARGS_08($1, $4, $6, $9, @$); }
595-
| defparameter_list "," "*" parameter "," "**" parameter {
596-
$$ = STAR_ARGS_09($1, $4, $7, @$); }
597-
| defparameter_list "," "**" parameter { $$ = STAR_ARGS_10($1, $4, @$); }
598-
599-
| defparameter_list "," "/" { $$ = STAR_ARGS_11($1, @$); }
600-
| defparameter_list "," "/" "," "*" parameter {
601-
$$ = STAR_ARGS_12($1, $6, @$); }
602-
| defparameter_list "," "/" "," "*" parameter "," defparameter_list {
603-
$$ = STAR_ARGS_13($1, $6, $8, @$); }
604-
| defparameter_list "," "/" "," "*" parameter "," defparameter_list
605-
"," "**" parameter { $$ = STAR_ARGS_14($1, $6, $8, $11, @$); }
606-
| defparameter_list "," "/" "," "**" parameter {
607-
$$ = STAR_ARGS_15($1, $6, @$); }
608-
| defparameter_list "," "/" "," "*" parameter "," "**" parameter {
609-
$$ = STAR_ARGS_16($1, $6, $9, @$); }
610-
| defparameter_list "," "/" "," defparameter_list "," "*" parameter {
611-
$$ = STAR_ARGS_17($1, $5, $8, @$); }
612-
| defparameter_list "," "/" "," defparameter_list "," "**" parameter {
613-
$$ = STAR_ARGS_18($1, $5, $8, @$); }
614-
| defparameter_list "," "/" "," defparameter_list "," "*" parameter
615-
"," "**" parameter { $$ = STAR_ARGS_19($1, $5, $8, $11, @$); }
616-
| defparameter_list "," "/" "," defparameter_list "," "*" parameter
617-
"," defparameter_list "," "**" parameter {
618-
$$ = STAR_ARGS_20($1, $5, $8, $10, $13, @$); }
619-
| defparameter_list "," "/" "," "*" "," defparameter_list {
620-
$$ = STAR_ARGS_21($1, $7, @$); }
621-
| defparameter_list "," "/" "," defparameter_list ","
622-
"*" "," defparameter_list { $$ = STAR_ARGS_22($1, $5, $9, @$); }
623-
| defparameter_list "," "*" "," defparameter_list {
624-
$$ = STAR_ARGS_23($1, $5, @$); }
625-
| "*" "," defparameter_list { $$ = STAR_ARGS_24($3, @$); }
602+
: "*" "," defparameter_list comma_opt { $$ = PARAMETER_LIST_05($3); }
603+
| "*" "," "**" parameter comma_opt { $$ = PARAMETER_LIST_06($4); }
604+
| "*" "," defparameter_list "," "**" parameter comma_opt {
605+
$$ = PARAMETER_LIST_07($3, $6); }
606+
| "*" parameter comma_opt { $$ = PARAMETER_LIST_08($2); }
607+
| "*" parameter "," defparameter_list comma_opt {
608+
$$ = PARAMETER_LIST_09($2, $4); }
609+
| "*" parameter "," "**" parameter comma_opt {
610+
$$ = PARAMETER_LIST_10($2, $5); }
611+
| "*" parameter "," defparameter_list "," "**" parameter comma_opt {
612+
$$ = PARAMETER_LIST_11($2, $4, $7); }
613+
| "**" parameter comma_opt { $$ = PARAMETER_LIST_06($2); }
626614
;
627615

628616
parameter_list_opt
629-
: defparameter_list comma_opt { $$ = FUNC_ARG_LIST_01($1, @$); }
630-
| defparameter_list "," TK_TYPE_COMMENT { ADD_TYPE_COMMENT($1, $3, @$);
631-
$$ = FUNC_ARG_LIST_01($1, @$); }
632-
| parameter_list_starargs { $$ = $1; }
633-
| %empty { $$ = FUNC_ARG_LIST_02(@$); }
634-
| defparameter_list "," "/" "," defparameter_list {
635-
$$ = FUNC_ARG_LIST_03($1, $5, @$); }
617+
: parameter_list { $$ = FUNC_ARGS_01(p.m_a, @$, $1); }
618+
| %empty { $$ = PARAMETER_LIST_12(@$); }
636619
;
637620

638621
comma_opt
@@ -869,7 +852,7 @@ lambda_id_list
869852

870853
lambda_expression
871854
: KW_LAMBDA ":" expr %prec LAMBDA {
872-
$$ = LAMBDA_01(FUNC_ARG_LIST_02(@$), $3, @$); }
855+
$$ = LAMBDA_01(PARAMETER_LIST_12(@$), $3, @$); }
873856
| KW_LAMBDA lambda_id_list ":" expr %prec LAMBDA {
874857
$$ = LAMBDA_01(FUNC_ARG_LIST_01($2, @$), $4, @$); }
875858
;

src/lpython/parser/parser_stype.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,24 @@ struct Arg {
2525
LPython::AST::expr_t *defaults;
2626
};
2727

28+
struct Var_Kw {
29+
Vec<Arg*> vararg;
30+
Vec<Arg*> kwonlyargs;
31+
Vec<Arg*> kwarg;
32+
};
33+
34+
struct Args_ {
35+
Vec<Arg*> args;
36+
bool var_kw_val;
37+
Var_Kw *var_kw;
38+
};
39+
40+
struct Fn_Arg {
41+
Vec<Arg*> posonlyargs;
42+
bool args_val;
43+
Args_ *args;
44+
};
45+
2846
union YYSTYPE {
2947
int64_t n;
3048
double f;
@@ -42,6 +60,10 @@ union YYSTYPE {
4260
Args *args;
4361
Vec<Args> vec_args;
4462

63+
Fn_Arg *fn_arg;
64+
Args_ *args_;
65+
Var_Kw *var_kw;
66+
4567
Key_Val *key_val;
4668
Vec<Key_Val*> vec_key_val;
4769

0 commit comments

Comments
 (0)