我正在使用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 .)
答案 0 :(得分:0)
如果使用p_error
调用None
,那么您就知道输入无法缩减为起始符号,因为找到了过早的EOF。
p_error
;正确编写语法后,如果解析成功通过缩减为起始符号,则不会调用它。