added while and repeat support to verilog parser

This commit is contained in:
Clifford Wolf 2014-06-06 17:40:04 +02:00
parent f9c1cd5edb
commit b5cd7a0179
4 changed files with 31 additions and 1 deletions

View File

@ -137,6 +137,7 @@ std::string AST::type2str(AstNodeType type)
X(AST_DEFAULT) X(AST_DEFAULT)
X(AST_FOR) X(AST_FOR)
X(AST_WHILE) X(AST_WHILE)
X(AST_REPEAT)
X(AST_GENVAR) X(AST_GENVAR)
X(AST_GENFOR) X(AST_GENFOR)
X(AST_GENIF) X(AST_GENIF)

View File

@ -117,6 +117,7 @@ namespace AST
AST_DEFAULT, AST_DEFAULT,
AST_FOR, AST_FOR,
AST_WHILE, AST_WHILE,
AST_REPEAT,
AST_GENVAR, AST_GENVAR,
AST_GENFOR, AST_GENFOR,

View File

@ -140,6 +140,8 @@ namespace VERILOG_FRONTEND {
"default" { return TOK_DEFAULT; } "default" { return TOK_DEFAULT; }
"generate" { return TOK_GENERATE; } "generate" { return TOK_GENERATE; }
"endgenerate" { return TOK_ENDGENERATE; } "endgenerate" { return TOK_ENDGENERATE; }
"while" { return TOK_WHILE; }
"repeat" { return TOK_REPEAT; }
"assert"([ \t\r\n]+"property")? { return TOK_ASSERT; } "assert"([ \t\r\n]+"property")? { return TOK_ASSERT; }

View File

@ -98,7 +98,7 @@ static void free_attr(std::map<std::string, AstNode*> *al)
%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM %token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM
%token TOK_INPUT TOK_OUTPUT TOK_INOUT TOK_WIRE TOK_REG %token TOK_INPUT TOK_OUTPUT TOK_INOUT TOK_WIRE TOK_REG
%token TOK_INTEGER TOK_SIGNED TOK_ASSIGN TOK_ALWAYS TOK_INITIAL %token TOK_INTEGER TOK_SIGNED TOK_ASSIGN TOK_ALWAYS TOK_INITIAL
%token TOK_BEGIN TOK_END TOK_IF TOK_ELSE TOK_FOR %token TOK_BEGIN TOK_END TOK_IF TOK_ELSE TOK_FOR TOK_WHILE TOK_REPEAT
%token TOK_POSEDGE TOK_NEGEDGE TOK_OR %token TOK_POSEDGE TOK_NEGEDGE TOK_OR
%token TOK_CASE TOK_CASEX TOK_CASEZ TOK_ENDCASE TOK_DEFAULT %token TOK_CASE TOK_CASEX TOK_CASEZ TOK_ENDCASE TOK_DEFAULT
%token TOK_FUNCTION TOK_ENDFUNCTION TOK_TASK TOK_ENDTASK %token TOK_FUNCTION TOK_ENDFUNCTION TOK_TASK TOK_ENDTASK
@ -819,6 +819,32 @@ behavioral_stmt:
ast_stack.pop_back(); ast_stack.pop_back();
ast_stack.pop_back(); ast_stack.pop_back();
} | } |
attr TOK_WHILE '(' expr ')' {
AstNode *node = new AstNode(AST_WHILE);
ast_stack.back()->children.push_back(node);
ast_stack.push_back(node);
append_attr(node, $1);
AstNode *block = new AstNode(AST_BLOCK);
ast_stack.back()->children.push_back($4);
ast_stack.back()->children.push_back(block);
ast_stack.push_back(block);
} behavioral_stmt {
ast_stack.pop_back();
ast_stack.pop_back();
} |
attr TOK_REPEAT '(' expr ')' {
AstNode *node = new AstNode(AST_REPEAT);
ast_stack.back()->children.push_back(node);
ast_stack.push_back(node);
append_attr(node, $1);
AstNode *block = new AstNode(AST_BLOCK);
ast_stack.back()->children.push_back($4);
ast_stack.back()->children.push_back(block);
ast_stack.push_back(block);
} behavioral_stmt {
ast_stack.pop_back();
ast_stack.pop_back();
} |
attr TOK_IF '(' expr ')' { attr TOK_IF '(' expr ')' {
AstNode *node = new AstNode(AST_CASE); AstNode *node = new AstNode(AST_CASE);
AstNode *block = new AstNode(AST_BLOCK); AstNode *block = new AstNode(AST_BLOCK);