我正在尝试使用PLY (python implementation of yacc)编写一个相当简单的语法,并且在我需要时让yacc
减少令牌字符串时遇到问题。
我想解释一系列带有不同类型参数的命令。每种不同类型的参数都有不同的标记。来自lex
的令牌字符串可能如下所示:
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG
我希望yacc
将每一行减少为名为instruction
的规则。但是,yacc
拒绝在最后一个参数(STRARG
)之后停止减少第一行,并且由于意外的COMMAND
令牌而生成语法错误。
也就是说,COMMAND VARARG VARARG STRARG
不再将instruction
缩减为yacc
,而是再次转移COMMAND VARARG VARARG STRARG COMMAND
(从下一个COMMAND
获取yacc
行,不应该读过。)
我的代码的def p_rule1(p):
r'instruction : COMMAND VARARG VARARG STRARG'
# do stuff
def p_rule2(p):
r'instruction : COMMAND VARARG STRARG STRARG'
# do other stuff
部分如下所示:
lex
我在规则规范中出现了一些明显的错误吗?这是我第一次使用yacc
/ {{1}},所以我不会感到惊讶。
答案 0 :(得分:1)
您需要包含用于处理多个指令的其他规则,因此yacc将知道如何处理第二个COMMAND令牌。像下面这样的东西应该有效。
instructions : instructions '\n' instruction
| instruction
instruction : COMMAND VARARG VARARG STRARG
{ do stuff }
| COMMAND VARARG STRARG STRARG
{do other stuff }