-----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