yacc无法减少(Python Lex yacc)
我正试图用编写一个相当简单的语法,但在需要时,我很难让yacc无法减少(Python Lex yacc),python,grammar,yacc,lex,ply,Python,Grammar,Yacc,Lex,Ply,我正试图用编写一个相当简单的语法,但在需要时,我很难让yacc减少标记字符串 我想解释一系列接受不同类型参数的命令。每种不同的论点都有不同的标志。来自lex的令牌字符串可能如下所示: COMMAND VARARG VARARG STRARG COMMAND VARARG STRARG STRARG def p_rule1(p): r'instruction : COMMAND VARARG VARARG STRARG' # do stuff def p_rule2(p):
yacc
减少标记字符串
我想解释一系列接受不同类型参数的命令。每种不同的论点都有不同的标志。来自lex
的令牌字符串可能如下所示:
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG
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
我希望yacc
将这些行中的每一行缩减为一个名为指令的规则。但是,yacc
拒绝停止减少最后一个参数(STRARG
)后的第一行,并由于意外的命令
标记而生成语法错误
也就是说,yacc
将命令VARARG VARARG STRARG
减少为指令
,yacc
再移动一次以获取命令VARARG VARARG STRARG COMMAND
(从下一行拾取最后一个命令
我的代码的yacc
部分如下所示:
COMMAND VARARG VARARG STRARG
COMMAND VARARG STRARG STRARG
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知道如何处理第二个命令令牌。像下面这样的方法应该可以奏效
instructions : instructions '\n' instruction
| instruction
instruction : COMMAND VARARG VARARG STRARG
{ do stuff }
| COMMAND VARARG STRARG STRARG
{do other stuff }
请参见您需要包括处理多条指令的附加规则,以便yacc知道如何处理第二个命令令牌。像下面这样的方法应该可以奏效
instructions : instructions '\n' instruction
| instruction
instruction : COMMAND VARARG VARARG STRARG
{ do stuff }
| COMMAND VARARG STRARG STRARG
{do other stuff }
请参见不幸的是,当我将该规则添加到代码中时,它从未被使用过。我认为这是因为它仍然不会将任何内容简化为指令
,因此指令
规则永远不会在堆栈上看到指令
。如果启用调试(使用新规则),堆栈进度看起来如下:COMMAND
->COMMAND VARARG
->COMMAND VARARG VARARG
->COMMAND VARARG VARARG STRARG
->COMMAND VARARG VARARG STRARG COMMAND
(由于无关的命令而在这里失败)。在移动最后一个命令之前,yacc
是否应该将命令VARARG VARARG STRARG
简化为指令
?此外,我执行指令
规则的方式是:def p_指令(p):r''instructions:instructions'\n'instruction | instruction''通过
不幸的是,当我将该规则添加到代码中时,它从未被使用。我认为这是因为它仍然不会将任何内容简化为指令
,因此指令
规则永远不会在堆栈上看到指令
。如果启用调试(使用新规则),堆栈进度看起来如下:COMMAND
->COMMAND VARARG
->COMMAND VARARG VARARG
->COMMAND VARARG VARARG STRARG
->COMMAND VARARG VARARG STRARG COMMAND
(由于无关的命令而在这里失败)。在移动最后一个命令之前,yacc
是否应该将命令VARARG VARARG STRARG
简化为指令
?此外,我执行指令
规则的方式是:定义p_指令(p):r''instructions:instructions'\n'instruction'instruction'\n'instruction''instruction''pass