如何检查输入字符串不能减少到 PLY 中的开始符号?

How to check that input string could not be reduced to start symbol in PLY?

我正在使用 PLY 为编程语言创建解析器。 问题是解析器 returns None 即使它没有将输入字符串减少到起始符号。

演示问题的简短示例

起始符号:程序

输入:{+

def p_program(p):
    'program : LBRACE PLUS RBRACE'
    pass

这里,解析器应该 return 某种错误,即到达 EOF 并且无法减少字符串。相反,它只是将 None 发送到 p_error(),这是发信号 EOF.

的标准

我怎么知道堆栈无法减少并且达到了EOF

来自 parser.out

的其他详细信息
state 1

    (0) S' -> program .



state 2

    (1) program -> LBRACE . PLUS RBRACE

    PLUS            shift and go to state 3


state 3

    (1) program -> LBRACE PLUS . RBRACE

    RBRACE          shift and go to state 4


state 4

    (1) program -> LBRACE PLUS RBRACE .

    $end            reduce using rule 1 (program -> LBRACE PLUS RBRACE .)

如果用 None 调用 p_error,那么您知道输入无法缩减为开始符号,因为发现了过早的 EOF。

p_error 仅在出现错误时调用;使用正确编写的语法,如果通过减少到开始符号成功解析,则不会调用它。