首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yacc无法减少(Python Lex-Yacc)

yacc无法减少(Python Lex-Yacc)
EN

Stack Overflow用户
提问于 2011-02-03 00:51:37
回答 1查看 734关注 0票数 1

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

我想解释一系列接受不同类型参数的命令。每种不同的参数都有不同的标记。从lex中产生的标记字符串可能如下所示:

代码语言:javascript
复制
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部分如下所示:

代码语言:javascript
复制
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,所以我不会感到惊讶。

EN

回答 1

Stack Overflow用户

发布于 2011-02-03 16:18:54

您需要包含处理多条指令的附加规则,以便yacc知道如何处理第二个命令令牌。像下面这样的东西应该可以工作。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4877277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档