glsl: Add productions to GLSL grammar for switch statement
authorDan McCabe <zen3d.linux@gmail.com>
Mon, 7 Nov 2011 23:07:43 +0000 (15:07 -0800)
committerDan McCabe <zen3d.linux@gmail.com>
Tue, 8 Nov 2011 00:31:21 +0000 (16:31 -0800)
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.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/glsl_parser.yy

index d32d6e4e1ceb9d326492a3ff62d7917a0bd7d1ee..8948c34a237a0d65d4839348d1fbe51d7a879d93 100644 (file)
 %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
@@ -1517,8 +1523,7 @@ simple_statement:
        declaration_statement
        | expression_statement
        | selection_statement
-       | switch_statement              { $$ = NULL; }
-       | case_label                    { $$ = NULL; }
+       | switch_statement
        | iteration_statement
        | jump_statement
        ;
@@ -1640,13 +1645,66 @@ 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: