-----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-----
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to