在ply中,我们如何区分使用了哪条规则-
示例:-‘’p:a b|c|d‘’所以假设我们需要为不同的规则编写不同的代码。那么有什么优雅的方法可以做到这一点吗?手册中给出的一种方法是使用规则和令牌的组合,但我发现并不总是点击。
发布于 2012-03-24 05:25:06
只需将表达式分解为多个规则,每个不同的代码对应一个规则。
例如(来自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]发布于 2013-09-25 05:10:57
拥有多个解析器不是问题,请查看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
https://stackoverflow.com/questions/9846412
复制相似问题