2014-05-24 5 views
-2

파이썬을 사용하여 괄호로 묶인 수식의 구문 분석 트리를 구성하고 싶습니다. 예를 들어파이썬을 사용하는 수식 파서

,

parse tree of ((x='a' OR x= 'b') AND(y ='c' OR y = 'd')) using python 

수식은 반드시 통상의 형태이다. 그것은 k-depth 회로 일 수도 있습니다.

파서는 '> =', '< =', '! ='등 연산자도 허용해야합니다.

내 용도로 가장 효과적인/효율적으로 사용할 수있는 파서는 어느 것입니까?

+0

당신이 분석 된 결과에 대해 수행 할 수 있습니까? 간단한 코드 실행은 해결책이 아닐 것입니다. –

+0

https://wiki.python.org/moin/LanguageParsing (예 : PyBison) – Pavel

+0

@ Jan-Philip Gehrcke : 나무 만 원합니다. 일부 데이터베이스 검색 메커니즘을 구현하려고합니다. – mxant

답변

1

나는 "속임수를 일찍이, 속이기도한다"라고하는 사람입니다. 다음은 입력 코드를 Python 표현식으로 변환하고, 일반적인 메커니즘을 사용하여 구문 분석 한 다음 구조체를 인쇄합니다.

import ast, re 

source = "((x='a' OR x= 'b') AND(y ='c' OR y = 'd'))" 

# turn source '=' into Python '==', unless it's part of a compound 
# IE: <= >= != => =< =! 
py_source = re.compile(
    r'(?<= [^<>!] )' 
    r'=' 
    r'(?<= [^<>!] )', 
    re.VERBOSE).sub('==', source.lower()) 

print 'SOURCE:', source 
print 'PYTHON:', py_source 

print ast.dump(ast.parse(py_source)) 

예 출력 :

SOURCE: ((x='a' OR x= 'b') AND(y ='c' OR y = 'd')) 
PYTHON: ((x=='a' or x== 'b') and(y =='c' or y == 'd')) 

Module(body=[Expr(value=BoolOp(op=And(), values=[BoolOp(op=Or(), values=[Compare(left=Name(id='x', ctx=Load()), ops=[Eq()], comparators=[Str(s='a')]), Compare(left=Name(id='x', ctx=Load()), ops=[Eq()], comparators=[Str(s='b')])]), BoolOp(op=Or(), values=[Compare(left=Name(id='y', ctx=Load()), ops=[Eq()], comparators=[Str(s='c')]), Compare(left=Name(id='y', ctx=Load()), ops=[Eq()], comparators=[Str(s='d')])])]))]) 
+0

코드를 보내 주셔서 감사합니다. 필자는이 패키지를 단지 간단한 방법으로 패키지 이름을 원하기는했지만 - (어떤 파서가 내 목적에 가장 효과적일까요?). 노력에 다시 한번 감사드립니다. – mxant