[Mesa-dev] [PATCH 2/5] glsl: Add productions to GLSL grammar for switch statement

Dan McCabe zen3d.linux at gmail.com
Mon Aug 1 17:29:45 PDT 2011


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



More information about the mesa-dev mailing list