Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
yacc无法减少(Python Lex yacc)_Python_Grammar_Yacc_Lex_Ply - Fatal编程技术网

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