From 01087d8da38c4b349bd21b431926d31add6c5138 Mon Sep 17 00:00:00 2001 From: z7zmey Date: Tue, 28 Nov 2017 22:47:44 +0200 Subject: [PATCH] parse Break Continue Return stmt --- parser.go | 1682 +++++++++++++++++++++++++++-------------------------- parser.y | 23 +- 2 files changed, 878 insertions(+), 827 deletions(-) diff --git a/parser.go b/parser.go index 7172ed8..fbe78c4 100644 --- a/parser.go +++ b/parser.go @@ -365,14 +365,18 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:565 +//line parser.y:574 const src = ` for_statement %type switch_case_list %type case_list +%type optional_expr %% @@ -267,7 +268,7 @@ top_statement: inner_statement_list: inner_statement_list inner_statement { $$ = $1.append($2); } - | /* empty */ { $$ = Node("statement_list") } + | /* empty */ { $$ = Node("stmt") } ; inner_statement: @@ -290,6 +291,9 @@ statement: append(Node("stmt").append($9)) } | T_SWITCH '(' expr ')' switch_case_list { $$ = Node("Switch").append(Node("expr").append($3)).append($5); } + | T_BREAK optional_expr ';' { $$ = Node("Break").append($2) } + | T_CONTINUE optional_expr ';' { $$ = Node("Continue").append($2) } + | T_RETURN optional_expr ';' { $$ = Node("Return").append($2) } | expr ';' { $$ = $1; } if_stmt_without_else: @@ -355,11 +359,11 @@ case_list: /* empty */ { $$ = Node("CaseList") } | case_list T_CASE expr case_separator inner_statement_list { - $$ = $1.append(Node("Case").append(Node("expr").append($3)).append(Node("stmt").append($5))) + $$ = $1.append(Node("Case").append(Node("expr").append($3)).append($5)) } | case_list T_DEFAULT case_separator inner_statement_list { - $$ = $1.append(Node("Default").append(Node("stmt").append($4))) + $$ = $1.append(Node("Default").append($4)) } ; @@ -546,6 +550,11 @@ expr: | expr_without_variable { $$ = $1; } ; +optional_expr: + /* empty */ { $$ = Node("null") } + | expr { $$ = $1; } +; + callable_variable: simple_variable { $$ = $1; } ; @@ -567,10 +576,14 @@ simple_variable: const src = `