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