如果一个可选表达式存在但是没有匹配,则抛出一个错误

时间:2016-06-15 13:08:43

标签: python dsl pyparsing

我使用PyParsing库来定义我自己的类似SQL的DSL。以下是相关部分:

argument_separator = pp.Suppress(",")
brace_open = pp.Suppress("(")
brace_close = pp.Suppress(")")

argument_string = pp.quotedString.setParseAction(pp.removeQuotes)

keyword_author = pp.CaselessKeyword("author")
keyword_date = pp.CaselessKeyword("date")

function_matches = pp.CaselessLiteral("matches")
function_in = pp.CaselessLiteral("in")
function_between = pp.CaselessLiteral("between")

author_matches = pp.Group(keyword_author + function_matches + brace_open +
                          pp.Group(argument_string) +
                          brace_close)
author_in = pp.Group(keyword_author + function_in + brace_open +
                     pp.Group(argument_string + pp.OneOrMore(argument_separator + argument_string)) +
                     brace_close)
date_between = pp.Group(keyword_date + function_between + brace_open +
                        pp.Group(argument_string + argument_separator + argument_string) +
                        brace_close)

expression = pp.Optional(author_matches | author_in) & pp.Optional(date_between)

示例:

# These all match:
author in("Lukas", "Timo", "Michae1")
author matches("hallo@welt.de")
date between("two days ago", "today")
author matches("knuth") date between("two days ago", "today")

# This does (and should) not.
date between(today)

最后一个表达式不匹配,但也不会抛出异常。它只返回一个空结果。

我的目标: A"查询"在我的DSL中由多个表单

组成
[column] [operator]([parameter],...)

不允许双重身份。此外,所有可能的表达式都是可选的(因此空查询是完全合法的)。

我的问题:如果其中一个表达式格式不正确,则当前方法不会抛出错误。因为它们都是Optional,如果它们不完全匹配,它们就会被忽略。这对用户来说很困惑,因为他没有收到错误,但结果是错误的。

所以,我需要的是一个可选的表达式(因此可以完全省略),但如果格式错误,则会抛出ParseException

1 个答案:

答案 0 :(得分:2)

在解析每一行时,请尝试将parseAll设置为True,例如expression.parseString(line, parseAll=True)。如果整条线都没有匹配,这将抛出ParseException例外。

有关详情,请参阅the "Using the pyparsing module" page