From 3e5af9828a347b0ba4759a35027175d51cb7e03f Mon Sep 17 00:00:00 2001 From: z7zmey Date: Tue, 28 Nov 2017 22:36:21 +0200 Subject: [PATCH] parse Switch stmt --- parser.go | 1700 ++++++++++++++++++++++++++++------------------------- parser.y | 38 +- 2 files changed, 921 insertions(+), 817 deletions(-) diff --git a/parser.go b/parser.go index f749c99..7172ed8 100644 --- a/parser.go +++ b/parser.go @@ -365,12 +365,13 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:538 +//line parser.y:565 const src = ` for_exprs %type non_empty_for_exprs %type for_statement +%type switch_case_list +%type case_list %% @@ -277,8 +279,8 @@ statement: '{' inner_statement_list '}' { $$ = $2; } | if_stmt { $$ = $1; } | alt_if_stmt { $$ = $1; } - | T_WHILE '(' expr ')' while_statement { $$ = Node("While").append(Node("expr").append($3)).append(Node("stmt").append($5)) } - | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Node("DoWhile").append(Node("expr").append($5)).append(Node("stmt").append($2))} + | T_WHILE '(' expr ')' while_statement { $$ = Node("While").append(Node("expr").append($3)).append(Node("stmt").append($5)); } + | T_DO statement T_WHILE '(' expr ')' ';' { $$ = Node("DoWhile").append(Node("expr").append($5)).append(Node("stmt").append($2)); } | T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement { $$ = Node("For"). @@ -287,6 +289,7 @@ statement: append(Node("expr3").append($7)). append(Node("stmt").append($9)) } + | T_SWITCH '(' expr ')' switch_case_list { $$ = Node("Switch").append(Node("expr").append($3)).append($5); } | expr ';' { $$ = $1; } if_stmt_without_else: @@ -341,6 +344,30 @@ non_empty_for_exprs: | expr { $$ = Node("ExpressionList").append($1) } ; +switch_case_list: + '{' case_list '}' { $$ = $2; } + | '{' ';' case_list '}' { $$ = $3; } + | ':' case_list T_ENDSWITCH ';' { $$ = $2; } + | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } +; + +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))) + } + | case_list T_DEFAULT case_separator inner_statement_list + { + $$ = $1.append(Node("Default").append(Node("stmt").append($4))) + } +; + +case_separator: + ':' + | ';' +; + for_statement: statement { $$ = $1; } | ':' inner_statement_list T_ENDFOR ';' { $$ = $2; } @@ -539,9 +566,10 @@ simple_variable: const src = `