2012-07-19 4 views
3

부울 식을 나타내는 문자열을 구문 분석하고 싶습니다. 다음 코드는 많은 예제를 기반으로하며 pyparsing의 operatorPrecedence 도우미를 사용합니다.pyparsing.operatorPrecedence가 유효하지 않은 문자열에서 오류를 발생시키지 않습니다.

문제는 문자열을 현저하게 구문 분석 할 수 없을 때 예외가 발생하기를 바랍니다. 그것이 의미하는 것처럼 많은 무효 표현은 조용히 지나가고 잘못된 표현이 반환됩니다.

import pyparsing 

_A = pyparsing.Literal('A') 
_B = pyparsing.Literal('B') 

bool_operand = pyparsing.Or((_A, _B)) 

precedence_list = [("NOT", 1, pyparsing.opAssoc.RIGHT), 
     ("AND", 2, pyparsing.opAssoc.LEFT), 
     ("OR", 2, pyparsing.opAssoc.LEFT),] 

bool_parser = pyparsing.operatorPrecedence(bool_operand, precedence_list) 

print bool_parser.parseString('A OR B OR NOT A') # A valid string 
print bool_parser.parseString('A NOT AND B') # an invalid string 

이 출력 :

[['A', 'OR', 'B', 'OR', ['NOT', 'A']]] 
['A'] 

그래서 제 문자열 작동하지만, 원하는대로 제 문자열 예외를 발생시키지 않는다.

어떻게하면됩니까? 나는 특히 pyparsing에 익숙하지 않다. 그래서 나는 거기에서 무엇인가 놓칠 수 있었다.

답변

3

Literal 클래스 대신 Keyword 클래스를 사용하도록 A_ 및 B_ 정의를 변경하십시오.

또한 parseString을 호출 할 때 전체 입력을 강제로 구문 분석 할 수 있도록 parseAll=True을 추가하십시오.

관련 문제