2011-11-03 124 views
1

我有一個遞歸語句下面的代碼片段從pyparsing解析器:pyparsing遞歸不會拋出異常

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']] 

只是默默地跳過最後一個條件。拋出異常。

如何捕獲此字符串中的錯誤?

+0

我沒有看到發生遞歸的部分。 –

+0

queryexpression = querycondition + ZeroOrMore(Word(「and」)+ querycondition) – RickyA

+0

這不是遞歸,只是在一個生產中兩次使用同一個非終結符。 – delnan

回答

1

queryexpression = querycondition +零或更多(字( 「和」)+ querycondition)

不需要解析整個線ZeroOrMore就是這個意思。當遇到不符合定義的事物時,它停止。它將始終成功,因爲「零」是嵌套表達式匹配次數的有效選項。

如果你想一直解析到行尾,那麼你將需要一個明確要求的表達式,例如通過添加+ LineEnd

行不是「特殊的」,除非你讓他們如此。默認情況下,解析表達式希望匹配輸入的前綴,而不是整個輸入,因爲您總是可能想要使用另一個表達式來解析下一位。

+1

'StringEnd'就是我所建議的,而不是'LineEnd'。您也可以通過將'parseAll = True'參數添加到'parseString'來完成此操作。 – PaulMcG

+0

@PaulMcGuire假設文本一次被送入解析器一行,當然。雖然我會假設這是OP的明顯期望情況...感謝您指出'parseAll'參數。 - 嘿,等等,你不是pyparsing的**作者嗎? :) –