1

我正在尝试使用PLY (python implementation of yacc)yacc编写一个相当简单的语法,并且在我想要减少标记字符串时遇到了麻烦。

我想解释一系列采用不同类型参数的命令。每种不同类型的论点都有不同的标记。出来的标记字符串lex可能如下所示:

COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG

我想yacc将这些行中的每一行简化为一个名为instruction. 但是,yacc拒绝停止减少最后一个参数 ( ) 之后的第一行,并由于意外标记STRARG而生成语法错误。COMMAND

也就是说,不是减少COMMAND VARARG VARARG STRARGinstruction,而是再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,所以我不会感到惊讶。

4

1 回答 1

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

于 2011-02-03T08:18:53.607 回答