The grammar is modified to support switch statements. Rather than follow the grammar in the appendix, which allows case labels to be placed ANYWHERE as a regular statement, we follow the development of the grammar as described in the body of the GLSL spec.
In this variation, the switch statement has a body which consists of a list of case statements. A case statement is preceded by a list of case labels and ends with a list of statements. --- src/glsl/glsl_parser.yy | 64 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy index 2c0498e..b3727ce 100644 --- a/src/glsl/glsl_parser.yy +++ b/src/glsl/glsl_parser.yy @@ -206,6 +206,12 @@ %type <declaration> struct_declarator_list %type <node> selection_statement %type <selection_rest_statement> selection_rest_statement +%type <node> switch_statement +%type <node> switch_body +%type <node> case_label +%type <node> case_label_list +%type <node> case_statement +%type <node> case_statement_list %type <node> iteration_statement %type <node> condition %type <node> conditionopt @@ -1519,8 +1525,7 @@ simple_statement: declaration_statement | expression_statement | selection_statement - | switch_statement { $$ = NULL; } - | case_label { $$ = NULL; } + | switch_statement | iteration_statement | jump_statement ; @@ -1642,15 +1647,68 @@ condition: } ; +/* + * siwtch_statement grammar is based on the syntax described in the body + * of the GLSL spec, not in it's appendix!!! + */ switch_statement: - SWITCH '(' expression ')' compound_statement + SWITCH '(' expression ')' switch_body + { + $$ = NULL; + } + ; + +switch_body: + '{' '}' + { + $$ = NULL; + } + | '{' case_statement_list '}' + { + $$ = NULL; + } ; case_label: CASE expression ':' + { + $$ = NULL; + } | DEFAULT ':' + { + $$ = NULL; + } ; +case_label_list: + case_label + { + $$ = NULL; + } + | case_label_list case_label + { + $$ = NULL; + } + ; + +case_statement: + case_label_list statement_list + { + $$ = NULL; + } + ; + +case_statement_list: + case_statement + { + $$ = NULL; + } + | case_statement_list case_statement + { + $$ = NULL; + } + ; + iteration_statement: WHILE '(' condition ')' statement_no_new_scope { -- 1.7.4.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev