Mesa (7.9): glsl: Eliminate reduce/reduce conflicts in glsl grammar

Ian Romanick idr at kemper.freedesktop.org
Tue Mar 1 00:04:40 UTC 2011


Module: Mesa
Branch: 7.9
Commit: cf2076f89d497597ab323ce1b84c0f196d839773
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cf2076f89d497597ab323ce1b84c0f196d839773

Author: Keith Packard <keithp at keithp.com>
Date:   Thu Oct  7 17:25:34 2010 -0700

glsl: Eliminate reduce/reduce conflicts in glsl grammar

This requires lexical disambiguation between variable and type
identifiers (as most C compilers do).

Signed-off-by: Keith Packard <keithp at keithp.com>

NOTE: This is a candidate for the 7.9 and 7.10 branches.
(cherry picked from commit f4b812e1a661448cf4b624f283c949a54b52e9d5)

---

 src/glsl/glsl_parser.ypp |   92 +++++++++++++++++++++++++++++++++++----------
 1 files changed, 71 insertions(+), 21 deletions(-)

diff --git a/src/glsl/glsl_parser.ypp b/src/glsl/glsl_parser.ypp
index 763295c..72a7234 100644
--- a/src/glsl/glsl_parser.ypp
+++ b/src/glsl/glsl_parser.ypp
@@ -96,7 +96,8 @@
 %token ISAMPLER1DARRAY ISAMPLER2DARRAY USAMPLER1D USAMPLER2D USAMPLER3D
 %token USAMPLERCUBE USAMPLER1DARRAY USAMPLER2DARRAY
 %token STRUCT VOID_TOK WHILE
-%token <identifier> IDENTIFIER
+%token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER
+%type <identifier> any_identifier
 %token <real> FLOATCONSTANT
 %token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT
 %token <identifier> FIELD_SELECTION
@@ -186,6 +187,10 @@
 %type <expression> function_call_generic
 %type <expression> function_call_or_method
 %type <expression> function_call
+%type <expression> method_call_generic
+%type <expression> method_call_header_with_parameters
+%type <expression> method_call_header_no_parameters
+%type <expression> method_call_header
 %type <n> assignment_operator
 %type <n> unary_operator
 %type <expression> function_identifier
@@ -281,8 +286,14 @@ extension_statement_list:
 	| extension_statement_list extension_statement
 	;
 
+any_identifier:
+	IDENTIFIER
+	| TYPE_IDENTIFIER
+	| NEW_IDENTIFIER
+	;
+
 extension_statement:
-	EXTENSION IDENTIFIER COLON IDENTIFIER EOL
+	EXTENSION any_identifier COLON any_identifier EOL
 	{
 	   if (!_mesa_glsl_process_extension($2, & @2, $4, & @4, state)) {
 	      YYERROR;
@@ -311,6 +322,7 @@ external_declaration_list:
 
 variable_identifier:
 	IDENTIFIER
+	| NEW_IDENTIFIER
 	;
 
 primary_expression:
@@ -367,7 +379,7 @@ postfix_expression:
 	{
 	   $$ = $1;
 	}
-	| postfix_expression '.' IDENTIFIER
+	| postfix_expression '.' any_identifier
 	{
 	   void *ctx = state;
 	   $$ = new(ctx) ast_expression(ast_field_selection, $1, NULL, NULL);
@@ -398,7 +410,7 @@ function_call:
 
 function_call_or_method:
 	function_call_generic
-	| postfix_expression '.' function_call_generic
+	| postfix_expression '.' method_call_generic
 	{
 	   void *ctx = state;
 	   $$ = new(ctx) ast_expression(ast_field_selection, $1, $3, NULL);
@@ -445,7 +457,7 @@ function_identifier:
 	   $$ = new(ctx) ast_function_expression($1);
 	   $$->set_location(yylloc);
    	}
-	| IDENTIFIER
+	| variable_identifier
 	{
 	   void *ctx = state;
 	   ast_expression *callee = new(ctx) ast_expression($1);
@@ -461,6 +473,44 @@ function_identifier:
    	}
 	;
 
+method_call_generic:
+	method_call_header_with_parameters ')'
+	| method_call_header_no_parameters ')'
+	;
+
+method_call_header_no_parameters:
+	method_call_header VOID_TOK
+	| method_call_header
+	;
+
+method_call_header_with_parameters:
+	method_call_header assignment_expression
+	{
+	   $$ = $1;
+	   $$->set_location(yylloc);
+	   $$->expressions.push_tail(& $2->link);
+	}
+	| method_call_header_with_parameters ',' assignment_expression
+	{
+	   $$ = $1;
+	   $$->set_location(yylloc);
+	   $$->expressions.push_tail(& $3->link);
+	}
+	;
+
+	// Grammar Note: Constructors look like methods, but lexical 
+	// analysis recognized most of them as keywords. They are now
+	// recognized through "type_specifier".
+method_call_header:
+	variable_identifier '('
+	{
+	   void *ctx = state;
+	   ast_expression *callee = new(ctx) ast_expression($1);
+	   $$ = new(ctx) ast_function_expression(callee);
+	   $$->set_location(yylloc);
+   	}
+	;
+
 	// Grammar Note: No traditional style type casts.
 unary_expression:
 	postfix_expression
@@ -748,7 +798,7 @@ function_header_with_parameters:
 	;
 
 function_header:
-	fully_specified_type IDENTIFIER '('
+	fully_specified_type variable_identifier '('
 	{
 	   void *ctx = state;
 	   $$ = new(ctx) ast_function();
@@ -759,7 +809,7 @@ function_header:
 	;
 
 parameter_declarator:
-	type_specifier IDENTIFIER
+	type_specifier any_identifier
 	{
 	   void *ctx = state;
 	   $$ = new(ctx) ast_parameter_declarator();
@@ -769,7 +819,7 @@ parameter_declarator:
 	   $$->type->specifier = $1;
 	   $$->identifier = $2;
 	}
-	| type_specifier IDENTIFIER '[' constant_expression ']'
+	| type_specifier any_identifier '[' constant_expression ']'
 	{
 	   void *ctx = state;
 	   $$ = new(ctx) ast_parameter_declarator();
@@ -831,7 +881,7 @@ parameter_type_specifier:
 
 init_declarator_list:
 	single_declaration
-	| init_declarator_list ',' IDENTIFIER
+	| init_declarator_list ',' any_identifier
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($3, false, NULL, NULL);
@@ -840,7 +890,7 @@ init_declarator_list:
 	   $$ = $1;
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| init_declarator_list ',' IDENTIFIER '[' ']'
+	| init_declarator_list ',' any_identifier '[' ']'
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($3, true, NULL, NULL);
@@ -849,7 +899,7 @@ init_declarator_list:
 	   $$ = $1;
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| init_declarator_list ',' IDENTIFIER '[' constant_expression ']'
+	| init_declarator_list ',' any_identifier '[' constant_expression ']'
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($3, true, $5, NULL);
@@ -858,7 +908,7 @@ init_declarator_list:
 	   $$ = $1;
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| init_declarator_list ',' IDENTIFIER '[' ']' '=' initializer
+	| init_declarator_list ',' any_identifier '[' ']' '=' initializer
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($3, true, NULL, $7);
@@ -867,7 +917,7 @@ init_declarator_list:
 	   $$ = $1;
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| init_declarator_list ',' IDENTIFIER '[' constant_expression ']' '=' initializer
+	| init_declarator_list ',' any_identifier '[' constant_expression ']' '=' initializer
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($3, true, $5, $8);
@@ -876,7 +926,7 @@ init_declarator_list:
 	   $$ = $1;
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| init_declarator_list ',' IDENTIFIER '=' initializer
+	| init_declarator_list ',' any_identifier '=' initializer
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($3, false, NULL, $5);
@@ -900,7 +950,7 @@ single_declaration:
 	      $$->set_location(yylloc);
 	   }
 	}
-	| fully_specified_type IDENTIFIER
+	| fully_specified_type any_identifier
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($2, false, NULL, NULL);
@@ -909,7 +959,7 @@ single_declaration:
 	   $$->set_location(yylloc);
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| fully_specified_type IDENTIFIER '[' ']'
+	| fully_specified_type any_identifier '[' ']'
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($2, true, NULL, NULL);
@@ -918,7 +968,7 @@ single_declaration:
 	   $$->set_location(yylloc);
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| fully_specified_type IDENTIFIER '[' constant_expression ']'
+	| fully_specified_type any_identifier '[' constant_expression ']'
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($2, true, $4, NULL);
@@ -927,7 +977,7 @@ single_declaration:
 	   $$->set_location(yylloc);
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| fully_specified_type IDENTIFIER '[' ']' '=' initializer
+	| fully_specified_type any_identifier '[' ']' '=' initializer
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($2, true, NULL, $6);
@@ -936,7 +986,7 @@ single_declaration:
 	   $$->set_location(yylloc);
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| fully_specified_type IDENTIFIER '[' constant_expression ']' '=' initializer
+	| fully_specified_type any_identifier '[' constant_expression ']' '=' initializer
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($2, true, $4, $7);
@@ -945,7 +995,7 @@ single_declaration:
 	   $$->set_location(yylloc);
 	   $$->declarations.push_tail(&decl->link);
 	}
-	| fully_specified_type IDENTIFIER '=' initializer
+	| fully_specified_type any_identifier '=' initializer
 	{
 	   void *ctx = state;
 	   ast_declaration *decl = new(ctx) ast_declaration($2, false, NULL, $4);
@@ -1115,7 +1165,7 @@ type_specifier_nonarray:
 	   $$ = new(ctx) ast_type_specifier($1);
 	   $$->set_location(yylloc);
 	}
-	| IDENTIFIER
+	| TYPE_IDENTIFIER
 	{
 	   void *ctx = state;
 	   $$ = new(ctx) ast_type_specifier($1);




More information about the mesa-commit mailing list