我正在尝试为使用flex / bison的全功能Verilog解析器添加一个小功能,过去几天我一直坚持这个问题。我确定Flex正常工作,因为我在使用gdb调试时看到了正确的令牌,但由于某种原因,Bison无法正确解析它。我正在尝试向解析器添加规则,该规则将模仿类似的规则,但使用不同的令牌项,在这种情况下,有一个使用令牌K_always
的规则,我正在尝试添加一个使用令牌K_always_ff
的行为与K_always完全相同。这是parse.y文件的相关片段:
module_item
: module
| attribute_list K_always statement_item
{ /*do stuff */ }
| attribute_list K_always_ff statement_item
{ /*do stuff */ }
| error ';'
{ yyerror(@2, "error: invalid module item."); }
statement_item
| K_begin K_end
{ /* do stuff... */ }
我有一个简单的Verilog文件用于测试,它使用always和always_ff:
module main(input a, output wire b);
assign b = a;
always begin
#5 $display("HEllo");
$finish;
end
always_ff begin
#5 $display("HEllo");
$finish;
end
endmodule
不幸的是,当我尝试解析文件时,解析器在包含always_ff块的行上遇到“语法错误”,打印错误规则error: invalid module item.
我试过查看gdb,虽然很难理解bison解析器内部是如何工作的,但我在每次调用词法分析器时都设置了一个break语句并观察了以下输出:
string=always name=always mask=1 tokenType=301
string=begin name=begin mask=1 tokenType=304
string=end name=end mask=1 tokenType=318
string=always_comb name=always_comb mask=20 tokenType=442
string=begin name=begin mask=1 tokenType=304
hello.v:23: error: Invalid module instantiation
hello.v:23: error: Invalid module item
string=end name=end mask=1 tokenType=318
所以看起来解析器在解析我添加的always_ff块时确定存在语法错误,但我找不到原因,因为它与always块的语法完全相同。有什么想法吗?