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