2017-02-21 67 views
1

在我能找到优先权的大多数例子中,使用分组(oneOf)文字来设置相同的级别。采用这种方法,我将不得不查找其中的2个(或更多),然后继续评估。我想要做的是将操作员分开,直接知道它是哪一个并对其进行评估。pyparsing优先权划分

这就是我想实现什么,但优先级别现在是错误的

arith_prec = [ 
    (subtract_op, 2, opAssoc.LEFT, ast.Substraction), 
    (add_op, 2, opAssoc.LEFT, ast.Addition), 
    (divide_op, 2, opAssoc.LEFT, ast.Division), 
    (multiplication_op, 2, opAssoc.LEFT, ast.Multiplication), 
] 

这是我收到了,但有与之相匹配的是其中两个(或更多)

plusop = oneOf(['+', '-']) 
multop = oneOf(['*', '/']) 
arith_prec = [ 
    (plusop, 2, opAssoc.LEFT,), 
    (multop, 2, opAssoc.LEFT,), 
] 

有没有办法做到这一点?我已经使用oneOf和Or里面的arith_prec进行了测试,但没有用。

回答

1

您必须在您的分析动作/类中匹配运算符。请注意,您可能会执行多个操作,而不是只有一个操作数。例如,解析“1 - 3 + 2”会给你[1, '-', 3, '+', 2],所以你真的不能创建一个加法或减法类。

也许他们结合起来,像AddSub和MultDiv类,会遍历左到右通过解析值评估价值:

class BinOp: 
    operator_map = {} 

    def __init__(self, tokens): 
     self.tokens = tokens 

    def eval(self): 
     seq = self.tokens 
     ret = seq[0] 
     for operator, operand in zip(seq[1::2], seq[2::2]): 
      ret = self.operator_map[operator](ret, operand) 
     return ret 

class AddSub(BinOp): 
    operator_map = {'+': operator.add, '-': operator.sub} 

class MultDiv(BinOp): 
    operator_map = {'*': operator.mul, '/': operator.truediv} 

plusop = oneOf(AddSub.operator_map.keys()) 
multop = oneOf(MultDiv.operator_map.keys()) 
arith_prec = [ 
    (multop, 2, opAssoc.LEFT, MultDiv), 
    (plusop, 2, opAssoc.LEFT, AddSub), 
] 

或扩大你的“加法”包括“概念+ '和' - '操作。 (如工程学校,我们不得不来概括“加速度”的概念,包括速度的任何变化,无论是向上或向下)。

在任何情况下,如果你使用的是infixNotation方法,你必须有每个优先级包括该级别的所有运营商。

+0

谢谢,所以我只好回到我开始的地方并从那里继续。 –

+0

顺便说一句,你的操作优先级是倒退 - 'multop'应该先走。 – PaulMcG