[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