如何检查输入字符串是否无法缩小以在PLY中启动符号?

时间:2016-02-26 05:02:59

标签: parsing 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 .)

1 个答案:

答案 0 :(得分:0)

如果使用p_error调用None,那么您就知道输入无法缩减为起始符号,因为找到了过早的EOF。

只有在出现错误时才会调用

p_error;正确编写语法后,如果解析成功通过缩减为起始符号,则不会调用它。