【问题标题】:Bison generated Parser exits before reading through entire fileBison 生成的 Parser 在读取整个文件之前退出
【发布时间】:2013-07-24 09:52:57
【问题描述】:

我有一个 BISON 为 Verilog 的子集生成的解析器。我看到解析器在读取整个文件之前跳转到文件末尾。我正在从解析器和我试图解析的文件中粘贴日志的 sn-p。

   Stack now 0 1 6 10 13 29 13 29 13 29 13 29 13 29 13 29 13 29 13 29 13
   Entering state 29
   Reading a token: --accepting rule at line 85(";")
   Next token is token SEMICOLON (design.v:1.207: )
   Shifting token SEMICOLON (design.v:1.207: )
   Entering state 13
   Reading a token: --accepting rule at line 100("0")
   Next token is token NUMBER (design.v:1.208: )
   Reducing stack by rule 12 (line 174):**
      $1 = token SEMICOLON (design.v:1.207: )
   -> $$ = nterm module_item_list (design.v:1.207: )
   Stack now 0 1 6 10 13 29 13 29 13 29 13 29 13 29 13 29 13 29 13 29 13 29
   Entering state 44
   Reducing stack by rule 11 (line 172):
      $1 = token SEMICOLON (design.v:1.185: )

正在解析的代码在下面

wire [3:0] z;
wire w1, w2, w3, w4, w5, w6, w7;
not (z[0], a[0]);  
xnor (z[1], a[0], a[1]);

在 "not();" 结束时失败

任何意见表示赞赏.. 谢谢。

【问题讨论】:

  • 其实这行好像是对的。你确定它不会因为之前的一些错误而失败吗?
  • 这是一个 Bison/yacc 问题,而不是 Verilog 问题。如果您需要任何帮助,您需要发布解析器的相关部分以及您遇到的错误。这是作业吗?
  • 如果该日志未经编辑,那么您的词法分析器似乎正在读取 ; 0,它不会连续出现在您的输入中。所以这可能是词法分析器问题,而不是解析器问题。您有什么证据表明解析器“跳转到文件末尾”?你引用的sn-p是文件的结尾吗?如果是这样,您的词法分析器将返回 NUMBER 而不是文件结尾标记,这也指向词法分析器问题。看看你的flex 规则会很有用。

标签: parsing bison flex-lexer


【解决方案1】:

实际上,看起来 Lexer 正在读取的缓冲区正在变为空。我为每个读取的令牌输出缓冲区.. 这就是它的样子..

    nor (z[3], w2, w3);
    nor (w4, sel, z[3]);
    nor (w5, sel, z[2]);
    and (w6, sel, z[1]);
    and (w7, sel, z[0]);
    or (out[1], w4, w6);
    or (out[0], w5, w7);
    endmodule

And 
  *yy_cp]
Let's check 
    yy_cp );  
    xnor (z[1], a[0], a[1]);
    or (w1, a[0], a[1]);
    xnor (z[2], a[2], w1);
    and (w2, a[2], a[1]);
    and (w3, a[2], a[0]);
    nor (z[3], w2, w3);
    nor (w4, sel, z[3]);
    nor (w5, sel, z[2]);
    and (w6, sel, z[1]);
    and (w7, sel, z[0]);
    or (out[1], w4, w6);
    or (out[0], w5, w7);
endmodule

And *yy_cp)
 Let's check yy_cp ;0_0And *yy_cp;

所以这里 yy_cp 是正在读取的缓冲区,而 *yy_cp 是每次传递的实际字符。如果您在某一时刻看到 yy_cp 有整个代码.. 下一刻它是 ) 0.. 我想知道这是语法问题还是什么?

不,这不是作业问题。

感谢您的所有建议..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2015-12-17
    • 2020-06-06
    • 1970-01-01
    • 2016-12-22
    • 2014-04-21
    相关资源
    最近更新 更多