如何检查输入字符串不能减少到 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
仅在出现错误时调用;使用正确编写的语法,如果通过减少到开始符号成功解析,则不会调用它。
我正在使用 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
仅在出现错误时调用;使用正确编写的语法,如果通过减少到开始符号成功解析,则不会调用它。