Handle for_variable_declaration

This can be handled entirely in the parser, where we rewrite the
syntax to me a begin/end block that contains the index variable
declaration and the for loop.
This commit is contained in:
Stephen Williams 2014-02-23 10:31:21 -08:00
parent a849249a86
commit aaee9989c2
1 changed files with 34 additions and 2 deletions

36
parse.y
View File

@ -1318,10 +1318,42 @@ loop_statement /* IEEE1800-2005: A.6.8 */
$$ = tmp; $$ = tmp;
} }
// Handle for_variable_declaration syntax by wrapping the for(...)
// statement in a synthetic named block. We can name the block
// after the variable that we are creating, that identifier is
// safe in the controlling scope.
| K_for '(' data_type IDENTIFIER '=' expression ';' expression ';' for_step ')' | K_for '(' data_type IDENTIFIER '=' expression ';' expression ';' for_step ')'
{ static unsigned for_counter = 0;
char for_block_name [64];
snprintf(for_block_name, sizeof for_block_name, "$ivl_for_loop%u", for_counter);
for_counter += 1;
PBlock*tmp = pform_push_block_scope(for_block_name, PBlock::BL_SEQ);
FILE_NAME(tmp, @1);
current_block_stack.push(tmp);
list<decl_assignment_t*>assign_list;
decl_assignment_t*tmp_assign = new decl_assignment_t;
tmp_assign->name = lex_strings.make($4);
assign_list.push_back(tmp_assign);
pform_makewire(@4, 0, str_strength, &assign_list, NetNet::REG, $3);
}
statement_or_null statement_or_null
{ $$ = 0; { pform_name_t tmp_hident;
yyerror(@3, "sorry: for_variable_declaration not supported"); tmp_hident.push_back(name_component_t(lex_strings.make($4)));
PEIdent*tmp_ident = pform_new_ident(tmp_hident);
FILE_NAME(tmp_ident, @4);
PForStatement*tmp_for = new PForStatement(tmp_ident, $6, $8, $10, $13);
FILE_NAME(tmp_for, @1);
pform_pop_scope();
vector<Statement*>tmp_for_list (1);
tmp_for_list[0] = tmp_for;
PBlock*tmp_blk = current_block_stack.top();
tmp_blk->set_statement(tmp_for_list);
$$ = tmp_blk;
delete[]$4;
} }
| K_forever statement_or_null | K_forever statement_or_null