解析器YACC中的EOF错误

时间:2011-11-22 00:53:08

标签: python parsing yacc ply

我正在尝试使用PLY库中为Python提供的yacc解析器来解析字符串。 解析器本身很长,但我遇到的问题是它总是给我同样的错误,无论我放什么样的字符串。  错误是这样的:

yacc:输入中的解析错误。 EOF

lexer运行得很好,所以我认为解析器就是问题所在。但我不明白这个错误,所以我甚至不知道在哪里首先要解决这个问题

有什么想法吗? 非常感谢你!

1 个答案:

答案 0 :(得分:6)

PLY中指定的所有解析器都应该有一个顶级规则,该规则会因解析整个输入文本而减少。例如,如果解析程序,顶级规则可能是这样的:

def p_program(p):
    '''
    program : declarations
    '''

def p_declarations(p):
    '''
    declarations : declarations declaration
                 | declaration
    '''
...

如果在解析器中出现“EOF”错误,则表示它在不降低顶级语法规则的情况下到达输入的末尾。也就是说,解析堆栈是非空的,并且没有更多可以减少的规则。由于堆栈非空,解析器将尝试移动更多符号并因EOF而失败。

此错误的一个潜在原因是您的语法中有一个未正确指定的起始规则。确保文件中的第一个p_rule(p)函数是启动规则。