yacc无法减少(Python Lex-Yacc)

时间:2011-02-02 16:51:37

标签: python grammar yacc lex ply

我正在尝试使用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}},所以我不会感到惊讶。

1 个答案:

答案 0 :(得分:1)

您需要包含用于处理多个指令的其他规则,因此yacc将知道如何处理第二个COMMAND令牌。像下面这样的东西应该有效。

instructions : instructions '\n' instruction
             | instruction

instruction : COMMAND VARARG VARARG STRARG
            { do stuff }
            | COMMAND VARARG STRARG STRARG
            {do other stuff }

请参阅http://luv.asn.au/overheads/lex_yacc/yacc.html#recusive