我正在尝试用PLY (python implementation of yacc)编写一个相当简单的语法,但在让yacc在我想要的时候减少标记字符串时遇到了麻烦。
我想解释一系列接受不同类型参数的命令。每种不同的参数都有不同的标记。从lex中产生的标记字符串可能如下所示:
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG我希望yacc将这些行中的每一行都简化为一个名为instruction的规则。但是,由于意外的COMMAND标记,yacc拒绝停止减少最后一个参数(STRARG)之后的第一行,并生成语法错误。
也就是说,yacc不是将COMMAND VARARG VARARG STRARG减少为instruction,而是再次移动以获取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,所以我不会感到惊讶。
发布于 2011-02-03 16:18:54
您需要包含处理多条指令的附加规则,以便yacc知道如何处理第二个命令令牌。像下面这样的东西应该可以工作。
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
https://stackoverflow.com/questions/4877277
复制相似问题