Bison无法解析类似的语法

时间:2017-05-11 02:41:10

标签: parsing verilog bison system-verilog yacc

我正在尝试为使用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.

的print语句

我试过查看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块的语法完全相同。有什么想法吗?

0 个答案:

没有答案