2017-02-21 4 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 또는 arith_prec의 내부를 사용하여 테스트했지만 아무 소용이 없습니다.

답변

1

구문 분석 작업/클래스 내의 연산자와 일치해야합니다. 두 개의 피연산자가있는 연산자가 아니라 여러 개의 연산을 얻을 수 있습니다. 예를 들어 "1 - 3 + 2"구문 분석은 [1, '-', 3, '+', 2]을 제공하므로 실제로는 더하기 또는 빼기 클래스를 만들 수 없습니다. +

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), 
] 

또는 '를 포함하는 "또한"당신의 개념을 확대 :

아마도 왼쪽에서 오른쪽으로 반복됩니다 구문 분석 된 값을하면 값을 평가하는 AddSub 및 MultDiv 같은 클래스로 결합 '및'- '조작. (공학 학교에서와 마찬가지로 속도의 변화를 위 또는 아래로 포함시키기 위해 "가속"개념을 일반화해야했습니다.)

어떤 경우에도 infixNotation 방법을 사용하는 경우, 우선 순위의 각 레벨은 해당 레벨의 모든 운영자를 포함합니다.

+0

감사합니다. 그래서 내가 시작한 곳으로 돌아가서 계속해야 할 것입니다. –

+0

Btw, 우선 순위가 뒤로 향합니다 - 'multop'이 먼저 가야합니다. – PaulMcG