【问题标题】:Python PLY multiple rulesPython PLY 多重规则
【发布时间】:2012-03-23 20:58:59
【问题描述】:

在ply中我们如何区分使用了哪个规则 -

示例:- ''' p : a b | c | d ''' 所以假设我们需要为不同的规则编写不同的代码。那么有什么优雅的方法可以做到这一点。手册中给出的一种方法是使用规则和令牌的组合,但我发现并不总是点击。

【问题讨论】:

    标签: python ply


    【解决方案1】:

    只需将表达式分解为多个规则,每个不同的代码使用一个规则。

    例如(来自http://www.dabeaz.com/ply/ply.html#ply_nn25

    def p_expression(p):
        '''expression : expression PLUS term
                  | expression MINUS term'''
        if p[2] == '+':
            p[0] = p[1] + p[3]
        elif p[2] == '-':
            p[0] = p[1] - p[3]
    

    也可以写成

    def p_expression_plus(p):
        'expression : expression PLUS term'
        p[0] = p[1] + p[3]
    
    def p_expression_minus(t):
        'expression : expression MINUS term'
        p[0] = p[1] - p[3]
    

    【讨论】:

    • 是的,我们可以做到这一点,但想象一下代码行数的激增。我们还可以为每一行使用不同的标记。我想知道是否有一些变量,例如规则,它告诉使用了哪个规则。无论如何,谢谢。
    • 啊,我明白了,对不起!恐怕我不知道一个变量来判断使用了哪个规则。 (我猜你预计代码会爆炸,因为不同规则的代码非常相似。也许你可以调用一个辅助函数来解析相似的规则,然后拆分成不同函数的开销不会那么昂贵?)
    【解决方案2】:

    拥有多个解析器不是问题,请查看 PLY 文档(这里 http://www.dabeaz.com/ply/ply.html#ply_nn37)

    lexer  = lex.lex()       # Return lexer object
    parser = yacc.yacc()     # Return parser object
    

    接下来,在解析时,请确保为 parse() 函数提供对它应该使用的词法分析器的引用。例如:

    parser.parse(text,lexer=lexer)
    

    如果您忘记这样做,解析器将使用最后创建的词法分析器——这并不总是您想要的。

    所以,你可以包含一些属性

    在解析器中,“lexer”和“parser”属性分别指的是lexer和parser对象。

    def p_expr_plus(p):
       'expr : expr PLUS expr'
       ...
       print p.parser          # Show parser object
       print p.lexer           # Show lexer object
    

    更多细节可以在这里找到

    http://www.dabeaz.com/ply/ply.html#ply_nn37

    【讨论】:

    • 他不是在问多个词法分析器和多个解析器 - 问题是关于单个解析器中的多个语法规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2017-11-21
    相关资源
    最近更新 更多