2017-02-21 75 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