在ply中,我们如何区分使用了哪个规则?
例如: ''' p : a b | c | d '''
假设我们需要为不同的规则编写不同的代码。那么有没有更优雅的方法呢?手册中给出的一种方法是使用规则和记号的组合,但我认为这种方法并不总是可行。
例如: ''' p : a b | c | d '''
假设我们需要为不同的规则编写不同的代码。那么有没有更优雅的方法呢?手册中给出的一种方法是使用规则和记号的组合,但我认为这种方法并不总是可行。
将表达式简单地分成多个规则,每个不同的代码都有一个规则。
例如(来自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]
lexer = lex.lex() # Return lexer object
parser = yacc.yacc() # Return parser object
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
更多细节可以在这里找到
%pred
来避免归约冲突,因为这些规则需要处于相同的级别。 - dionyziz