解析器YACC中的EOF错误
我正在尝试使用Python的PLY库中的yacc解析器来解析一个字符串。这个解析器本身很复杂,但我遇到的问题是,无论我输入什么样的字符串,它总是给我同样的错误。这个错误是:
yacc: 输入中的解析错误。EOF
而词法分析器(lexer)运行得很好,所以我觉得问题出在解析器上。但是我不太理解这个错误,所以我甚至不知道该从哪里开始解决这个问题。
有没有什么建议?非常感谢!
1 个回答
8
在PLY中,所有的解析器都应该有一个主要的规则,这个规则会在解析整个输入文本的过程中被简化。举个例子,如果你在解析一个程序,主要的规则可能是这样的:
def p_program(p):
'''
program : declarations
'''
def p_declarations(p):
'''
declarations : declarations declaration
| declaration
'''
...
如果你在解析器中遇到“EOF”错误,这意味着解析器在到达输入的末尾时,没有成功简化主要的语法规则。也就是说,解析的堆栈里还有东西,但没有更多的规则可以被简化。由于堆栈不为空,解析器会尝试继续处理更多的符号,但因为到达了输入的末尾而失败。
这个错误的一个可能原因是你的语法中起始规则设置不正确。确保文件中的第一个p_rule(p)函数是起始规则。