2011-11-03 3 views
1

내가 가지고 대한 파싱 파서에서 재귀 문을 다음 코드 :대한 파싱의 재귀 예외 throw하지 않습니다

def parse_query(querystr): 
    # <<other parsing stuff>> 
    queryexpression = querycondition + ZeroOrMore(Word("and") + querycondition) 
    try: 
     return queryexpression.parseString(querystr) 
    except ParseException as e: 
     logger.debug("Error parsing '{0}': \n {1}".format(querystr, e)) 
     return None 

나는이 쿼리 공급하는 경우 :

tokens = parse_query("HR:EE > -28.9 and BL:AA = 0 THISISNOTAND KLAS:TT eq true") 
print(tokens) 

가 산출 :

[['HR', ':', 'EE', '>', '-28.9'], 'and', ['BL', ':', 'AA', '=', '0']] 

그냥 마지막 상태를 건너 뜁니다. 예외가 발생하지 않습니다.

이 문자열에서 오류를 어떻게 catch합니까?

+0

재귀가 발생하는 부분이 보이지 않습니다. –

+0

queryexpression = querycondition + ZeroOrMore (Word ("and") + querycondition) – RickyA

+0

이것은 재귀가 아니며 단지 한 번의 생산에서 동일한 비 터미널을 두 번 사용하는 것입니다. – delnan

답변

1

queryexpression = querycondition ZeroOrMore + (워드 ('와') + querycondition)는

전체 라인를 분석 할 필요가 없다. ZeroOrMore은 정확히 의미합니다. 정의를 충족시키지 못하는 것을 발견하면 중지됩니다. 중첩 된 표현식이 일치하는 횟수에 대해 "0"이 유효한 옵션이므로 항상 성공합니다.

줄 끝까지 구문 분석하려면 명시 적으로 필요로하는 표현식이 필요합니다 (예 : + LineEnd에 붙임으로써).

줄을 "특별"하지 않는 한 그렇게하지 마십시오. 구문 분석 식은 기본적으로 다른 입력을 사용하여 다음 비트를 구문 분석하기를 원하기 때문에 입력의 접두사와 일치해야합니다.

+1

'StringEnd'는'LineEnd'와는 달리 제안 할 것입니다. 'parseAll = True' 인수를'parseString'에 추가하여이 작업을 수행 할 수도 있습니다. – PaulMcG

+0

@PaulMcGuire는 텍스트가 한 번에 한 줄씩 파서에 공급된다고 가정합니다. OP의 명백한 기대가 주어진다 고 가정 할지라도 ... 'parseAll'인수를 지적 해 주셔서 감사합니다. 이봐, 잠깐, 너는 ** 퓰어링의 저자 **가 아닌가? :) –