无法弄清楚导致yacc中的移位/减少错误的原因

时间:2011-02-06 00:09:14

标签: yacc bison

我正在yacc的一个项目上工作,我得到一个转移/减少错误,但我无法弄清楚为什么我得到它。我一直在浏览y.output文件,但我不太清楚如何阅读它。我的y.output文件超过了SO的字符限制,所以我把它扔在了pastebin:http://pastebin.com/AQ2UtAip上。关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:2)

我不完全确定,但我认为问题是,在T_Identifier开头看到StmtBlock时,解析器无法确定是否看到VariableDecl或只有一个前瞻标记的Expr。如果您可以更改语言规范,一个简单的解决方法是在变量声明之前要求var之类的关键字。

答案 1 :(得分:0)

我不完全确定,但我认为问题在于:VariableDeclList: VariableDeclList VariableDecl当发现可能VariableDeclList的内容时,它可能会递归地跟随VariableDeclList 1}}直到用完堆栈。尝试使用VariableDeclList交换VariableDecl的顺序?

答案 2 :(得分:0)

尝试以不同的方式修复或使用Epsilon。我怀疑VariableDeclList减少了,现在它不知道它是否需要在执行Stmt之前先减少StmtList,或者不减少它并使用VariableDecl。我知道VariableDeclList不是问题,因为你在两个规则中都这样做,但是现在可以减少StmtList,然后知道要遵循哪个规则哪个是问题(因为并非所有规则都在同一个地方/顺序减少它)。

state 74

   38 StmtBlock: '{' VariableDeclList . StmtList '}'
   39 VariableDeclList: VariableDeclList . VariableDecl


StmtList: StmtList Stmt
        | Epsilon