[Mesa-dev] [PATCH 4/6] glsl: Reference data structure ctors in grammar

Ian Romanick idr at freedesktop.org
Mon Jun 20 15:34:26 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 06/17/2011 05:43 PM, Dan McCabe wrote:
> We now tie the grammar to the ctors of the ASTs they reference.
> 
> This requires that we actually have definitions of the ctors.
> 
> In addition, we also need to define "print" and "hir" methods for the AST
> classes. At this stage of the development, we simply stub out the "print"
> and "hir" methods and flesh them out later.
> 
> Also, since actual class instances get returned by the productions in the
> grammar, we also need to designate the type of the productions that
> reference those instances.
> ---
>  src/glsl/ast_to_hir.cpp         |   54 ++++++++++++++++++++++++++++
>  src/glsl/glsl_parser.yy         |   58 ++++++++++++++++++++++--------
>  src/glsl/glsl_parser_extras.cpp |   74 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 170 insertions(+), 16 deletions(-)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 3b87f0d..553e459 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3274,6 +3274,60 @@ ast_selection_statement::hir(exec_list *instructions,
>  }
>  
>  
> +ir_rvalue *
> +ast_switch_statement::hir(exec_list *instructions,
> +			  struct _mesa_glsl_parse_state *state)
> +{
> +   // TODO - implement me!!!
> +   return NULL;
> +}
> +
> +
> +ir_rvalue *
> +ast_switch_body::hir(exec_list *instructions,
> +			  struct _mesa_glsl_parse_state *state)
> +{
> +   // TODO - implement me!!!
> +   return NULL;
> +}
> +
> +
> +ir_rvalue *
> +ast_case_statement::hir(exec_list *instructions,
> +			  struct _mesa_glsl_parse_state *state)
> +{
> +   // TODO - implement me!!!
> +   return NULL;
> +}
> +
> +
> +ir_rvalue *
> +ast_case_statement_list::hir(exec_list *instructions,
> +			  struct _mesa_glsl_parse_state *state)
> +{
> +   // TODO - implement me!!!
> +   return NULL;
> +}
> +
> +
> +ir_rvalue *
> +ast_case_label::hir(exec_list *instructions,
> +			  struct _mesa_glsl_parse_state *state)
> +{
> +   // TODO - implement me!!!
> +   return NULL;
> +}
> +
> +
> +ir_rvalue *
> +ast_case_label_list::hir(exec_list *instructions,
> +			  struct _mesa_glsl_parse_state *state)
> +{
> +   // TODO - implement me!!!
> +   return NULL;
> +}
> +
> +
>  void
>  ast_iteration_statement::condition_to_hir(ir_loop *stmt,
>  					  struct _mesa_glsl_parse_state *state)
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index b3727ce..3ba3282 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -67,6 +67,11 @@
>     ast_declarator_list *declarator_list;
>     ast_struct_specifier *struct_specifier;
>     ast_declaration *declaration;
> +   ast_switch_body *switch_body;
> +   ast_case_label *case_label;
> +   ast_case_label_list *case_label_list;
> +   ast_case_statement *case_statement;
> +   ast_case_statement_list *case_statement_list;
>  
>     struct {
>        ast_node *cond;
> @@ -207,11 +212,11 @@
>  %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 <switch_body> switch_body
> +%type <case_label_list> case_label_list
> +%type <case_label> case_label
> +%type <case_statement> case_statement
> +%type <case_statement_list> case_statement_list
>  %type <node> iteration_statement
>  %type <node> condition
>  %type <node> conditionopt
> @@ -1654,58 +1659,79 @@ condition:
>  switch_statement:
>  	SWITCH '(' expression ')' switch_body
>  	{
> -	   $$ = NULL;
> +	   void *ctx = state;
> +	   $$ = new(ctx) ast_switch_statement($3, $5);

In this instance (and the similar ones below), I'd just do 'new(state)'.
 After most of the parser was written we started always calling the
memory context mem_ctx.

>  	}
>  	;
>  
>  switch_body:
>  	'{' '}'
>  	{
> -	   $$ = NULL;
> +	   void *ctx = state;
> +	   $$ = new(ctx) ast_switch_body(NULL);
> +	   $$->set_location(yylloc);
>  	}
>  	| '{' case_statement_list '}'
>  	{
> -	   $$ = NULL;
> +	   void *ctx = state;
> +	   $$ = new(ctx) ast_switch_body($2);
> +	   $$->set_location(yylloc);
>  	}
>  	;
>  
>  case_label:
>  	CASE expression ':'
>  	{
> -	   $$ = NULL;
> +	   $$ = new(state) ast_case_label($2);
>  	}
>  	| DEFAULT ':'
>  	{
> -	   $$ = NULL;
> +	   $$ = new(state) ast_case_label(NULL);
>  	}
>  	;
>  
>  case_label_list:
>  	case_label
>  	{
> -	   $$ = NULL;
> +	   ast_case_label_list *labels = new(state) ast_case_label_list();
> +
> +	   labels->labels.push_tail(& $1->link);
> +	   $$ = labels;
>  	}
>  	| case_label_list case_label
>  	{
> -	   $$ = NULL;
> +	   $$ = $1;
> +	   $$->labels.push_tail(& $2->link);
>  	}
>  	;
>  
>  case_statement:
> -	case_label_list statement_list
> +	case_label_list statement
>  	{
> -	   $$ = NULL;
> +	   ast_case_statement *stmts = new(state) ast_case_statement($1);
> +
> +	   stmts->stmts.push_tail(& $2->link);
> +	   $$ = stmts
> +	}
> +	| case_statement statement
> +	{
> +	   $$ = $1;
> +	   $$->stmts.push_tail(& $2->link);
>  	}
>  	;
>  
>  case_statement_list:
>  	case_statement
>  	{
> -	   $$ = NULL;
> +	   ast_case_statement_list *cases= new(state) ast_case_statement_list();
> +
> +	   cases->cases.push_tail(& $1->link);
> +	   $$ = cases;
>  	}
>  	| case_statement_list case_statement
>  	{
> -	   $$ = NULL;
> +	   $$ = $1;
> +	   $$->cases.push_tail(& $2->link);
>  	}
>  	;
>  	
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index d9aa300..a351e12 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -693,6 +693,80 @@ ast_selection_statement::ast_selection_statement(ast_expression *condition,
>  
>  
>  void
> +ast_switch_statement::print(void) const
> +{
> +   printf("TODO - implement me!!!");
> +}
> +
> +
> +ast_switch_statement::ast_switch_statement(ast_expression *test_expression,
> +					   ast_node *body)
> +{
> +   this->test_expression = test_expression;
> +   this->body = body;
> +}
> +
> +
> +void 
> +ast_switch_body::print(void) const
> +{
> +   printf("TODO - implement me!!!");
> +}
> +
> +
> +ast_switch_body::ast_switch_body(ast_case_statement_list *stmts)
> +{
> +   this->stmts = stmts;
> +}
> +
> +
> +void ast_case_label::print(void) const
> +{
> +   printf("TODO - implement me!!!");
> +}
> +
> +
> +ast_case_label::ast_case_label(ast_expression *test_value)
> +{
> +   this->test_value = test_value;
> +}
> +
> +
> +void ast_case_label_list::print(void) const
> +{
> +   printf("TODO - implement me!!!");
> +}
> +
> +
> +ast_case_label_list::ast_case_label_list(void)
> +{
> +}
> +
> +
> +void ast_case_statement::print(void) const
> +{
> +   printf("TODO - implement me!!!");
> +}
> +
> +
> +ast_case_statement::ast_case_statement(ast_case_label_list *labels)
> +{
> +   this->labels = labels;
> +}
> +
> +
> +void ast_case_statement_list::print(void) const
> +{
> +   printf("TODO - implement me!!!");
> +}
> +
> +
> +ast_case_statement_list::ast_case_statement_list(void)
> +{
> +}
> +
> +
> +void
>  ast_iteration_statement::print(void) const
>  {
>     switch (mode) {

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk3/yvIACgkQX1gOwKyEAw/DcwCeLgbK/lHTXj4EowgDqiLcd0o4
SjwAoJz6TAlnMCHKiG3vClm4NLjSef2M
=6dMG
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list