如何检查输入字符串无法简化为 PLY 中的开始符号



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

演示问题的简短示例

起始符号:程序

输入:{+

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

在这里,解析器应该返回某种错误,即已达到 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;使用正确编写的语法,如果解析通过简化为开始符号而成功,则不会调用它。

最新更新