2011-11-03 116 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的**作者吗? :) –