Skip to content

Commit

Permalink
Filled in the rest of the missing print_ast() cases.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Feb 23, 2010
1 parent b2f1fee commit 1e6de97
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 9 deletions.
114 changes: 108 additions & 6 deletions mojoshader_compiler.c
Expand Up @@ -428,7 +428,7 @@ typedef struct WhileStatement
{
ASTNode ast;
struct Statement *next;
int64 unroll; // # times to unroll, 0 to loop, -1 for compiler's choice.
int64 unroll; // # times to unroll, 0 to loop, negative for compiler's choice.
Expression *expr;
Statement *statement;
} WhileStatement;
Expand All @@ -439,7 +439,7 @@ typedef struct ForStatement
{
ASTNode ast;
struct Statement *next;
int64 unroll; // # times to unroll, 0 to loop, -1 for compiler's choice.
int64 unroll; // # times to unroll, 0 to loop, negative for compiler's choice.
VariableDeclaration *var_decl;
Expression *initializer;
Expression *looptest;
Expand Down Expand Up @@ -2362,11 +2362,90 @@ static void print_ast(void *ast)
break;

case AST_STATEMENT_FOR:
if (((ForStatement *) ast)->unroll == 0)
printf("[loop] ");
else if (((ForStatement *) ast)->unroll == -1)
printf("[unroll] ");
else if (((ForStatement *) ast)->unroll > 0)
{
printf("[unroll(%lld)] ",
(long long) (((ForStatement *) ast)->unroll) );
} // else if

printf("for (");
print_ast(((ForStatement *) ast)->var_decl);
print_ast(((ForStatement *) ast)->initializer);
printf("; ");
print_ast(((ForStatement *) ast)->looptest);
printf("; ");
print_ast(((ForStatement *) ast)->counter);
printf(")\n");
for (i = 0; i < indent; i++) printf(" ");
printf("{\n");
indent++;
for (i = 0; i < indent; i++) printf(" ");
print_ast(((ForStatement *) ast)->statement);
printf("\n");
indent--;
for (i = 0; i < indent; i++) printf(" ");
printf("}\n");
for (i = 0; i < indent; i++) printf(" ");
print_ast(((Statement *) ast)->next);
break;

case AST_STATEMENT_DO:
if (((DoStatement *) ast)->unroll == 0)
printf("[loop] ");
else if (((DoStatement *) ast)->unroll == -1)
printf("[unroll] ");
else if (((DoStatement *) ast)->unroll > 0)
{
printf("[unroll(%lld)] ",
(long long) (((DoStatement *) ast)->unroll) );
} // else if

printf("do\n");
for (i = 0; i < indent; i++) printf(" ");
printf("{\n");
indent++;
for (i = 0; i < indent; i++) printf(" ");
print_ast(((DoStatement *) ast)->statement);
printf("\n");
indent--;
for (i = 0; i < indent; i++) printf(" ");
printf("} while (");
print_ast(((DoStatement *) ast)->expr);
printf(");\n");
for (i = 0; i < indent; i++) printf(" ");
print_ast(((Statement *) ast)->next);
break;

case AST_STATEMENT_WHILE:
printf("[!!!]");
if (((WhileStatement *) ast)->unroll == 0)
printf("[loop] ");
else if (((WhileStatement *) ast)->unroll == -1)
printf("[unroll] ");
else if (((WhileStatement *) ast)->unroll > 0)
{
printf("[unroll(%lld)] ",
(long long) (((WhileStatement *) ast)->unroll) );
} // else if

printf("while (");
print_ast(((WhileStatement *) ast)->expr);
printf(")\n");
for (i = 0; i < indent; i++) printf(" ");
printf("{\n");
indent++;
for (i = 0; i < indent; i++) printf(" ");
print_ast(((WhileStatement *) ast)->statement);
printf("\n");
indent--;
for (i = 0; i < indent; i++) printf(" ");
printf("}\n");
for (i = 0; i < indent; i++) printf(" ");
print_ast(((Statement *) ast)->next);
break; // !!! FIXME: write me.
break;

case AST_STATEMENT_RETURN:
printf("return");
Expand Down Expand Up @@ -2583,11 +2662,34 @@ static void print_ast(void *ast)
break;

case AST_PACK_OFFSET:
printf(" : packoffset(%s%s%s)",
((PackOffset *) ast)->ident1,
((PackOffset *) ast)->ident2 ? "." : "",
((PackOffset *) ast)->ident2 ? ((PackOffset *) ast)->ident2 : "");
break;

case AST_VARIABLE_LOWLEVEL:
case AST_ANNOTATION:
printf("[!!!]");
print_ast(((VariableLowLevel *) ast)->packoffset);
if (((VariableLowLevel *) ast)->register_name)
printf(" : register(%s)", ((VariableLowLevel *) ast)->register_name);
break;

case AST_ANNOTATION:
{
const Annotations *a = (Annotations *) ast;
printf("<");
while (a)
{
printf(" %s ", a->datatype);
print_ast(a->initializer);
if (a->next)
printf(",");
a = a->next;
} // while
printf(" >");
break;
} // case

default:
assert(0 && "unexpected type");
break;
Expand Down
6 changes: 3 additions & 3 deletions mojoshader_parser_hlsl.lemon
Expand Up @@ -509,7 +509,7 @@ statement(A) ::= for_statement(B). { A = B; }
while_intro(A) ::= LBRACKET UNROLL LPAREN INT_CONSTANT(B) RPAREN RBRACKET WHILE. { A = (B.i64 < 0) ? 0 : B.i64; }
while_intro(A) ::= LBRACKET UNROLL RBRACKET WHILE. { A = -1; }
while_intro(A) ::= LBRACKET LOOP RBRACKET WHILE. { A = 0; }
while_intro(A) ::= WHILE. { A = -1; }
while_intro(A) ::= WHILE. { A = -2; }

%type for_statement { Statement * }
%destructor for_statement { delete_statement(ctx, $$); }
Expand All @@ -519,7 +519,7 @@ for_statement(A) ::= for_intro(B) for_details(C). { A = C; ((ForStatement *) A)-
for_intro(A) ::= LBRACKET UNROLL LPAREN INT_CONSTANT(B) RPAREN RBRACKET FOR. { A = (B.i64 < 0) ? 0 : B.i64; }
for_intro(A) ::= LBRACKET UNROLL RBRACKET FOR. { A = -1; }
for_intro(A) ::= LBRACKET LOOP RBRACKET FOR. { A = 0; }
for_intro(A) ::= FOR. { A = -1; }
for_intro(A) ::= FOR. { A = -2; }

%type for_details { Statement * }
%destructor for_details { delete_statement(ctx, $$); }
Expand All @@ -540,7 +540,7 @@ for_details(A) ::= LPAREN variable_declaration(B) expression(C) SEMICOLON RPAREN
do_intro(A) ::= LBRACKET UNROLL LPAREN INT_CONSTANT(B) RPAREN RBRACKET DO. { A = (B.i64 < 0) ? 0 : (int) B.i64; }
do_intro(A) ::= LBRACKET UNROLL RBRACKET DO. { A = -1; }
do_intro(A) ::= LBRACKET LOOP RBRACKET DO. { A = 0; }
do_intro(A) ::= DO. { A = -1; }
do_intro(A) ::= DO. { A = -2; }

%type if_intro { int }
if_intro(A) ::= LBRACKET BRANCH RBRACKET IF. { A = IFATTR_BRANCH; }
Expand Down

0 comments on commit 1e6de97

Please sign in to comment.