gpt4 book ai didi

python - yacc 无法归约 (Python Lex-Yacc)

转载 作者:太空宇宙 更新时间:2023-11-03 19:32:55 29 4
gpt4 key购买 nike

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

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

COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG

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

也就是说,yacc 不是将 COMMAND VARARG VARARG STRARG 简化为 指令,而是再移位一次以获得 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,所以我不会感到惊讶。

最佳答案

您需要包含处理多个指令的附加规则,以便 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

关于python - yacc 无法归约 (Python Lex-Yacc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4877277/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com