Python PLY多规则

4
在ply中,我们如何区分使用了哪个规则?
例如: ''' p : a b | c | d '''
假设我们需要为不同的规则编写不同的代码。那么有没有更优雅的方法呢?手册中给出的一种方法是使用规则和记号的组合,但我认为这种方法并不总是可行。
2个回答

0

将表达式简单地分成多个规则,每个不同的代码都有一个规则。

例如(来自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]

1
是的,我们可以做到,但想象一下代码行数的激增。我们也可以使用不同的标记,每行一个。我想知道是否有某个变量,比如规则,可以告诉我们使用了哪个规则。无论如何,谢谢。 - Dipendra Kumar Mishra
啊,我明白了,抱歉!恐怕我不知道有哪个变量可以告诉我们使用了哪个规则。(我猜你期望代码会崩溃,因为你对不同规则使用了非常相似的代码。也许你可以调用一个辅助函数来解析类似的规则,这样分成不同的函数的开销就不会那么大了?) - Peter de Rivaz
在更复杂的语法中,如果规则具有不同的优先级,则需要使用%pred来避免归约冲突,因为这些规则需要处于相同的级别。 - dionyziz

-1
拥有多个解析器并不是问题,请查看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”属性分别指代词法分析器和语法分析器对象。

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


他并不是在询问多个词法分析器和多个语法分析器的问题 - 他的问题是关于单个语法分析器中的多个语法规则。 - dionyziz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接