我正在使用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
;使用正确编写的语法,如果解析通过简化为开始符号而成功,则不会调用它。