如果存在但不匹配,则使可选表达式抛出错误
Make an Optional expression throw an error if it was present but didn't match
我正在使用 PyParsing 库来定义我自己的 SQL-like 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)
最后一个表达式不匹配但也没有抛出异常。它只是 returns 一个空结果。
我的目标: 我的 DSL 中的一个 "query" 由
形式的多个表达式组成
[column] [operator]([parameter],...)
不允许双胞胎。此外,所有可能的表达式都是可选的(因此空查询是完全合法的)。
我的问题: 如果其中一个表达式格式不正确,当前方法不会抛出错误。因为都是Optional
,如果不完全匹配,直接忽略。这让用户感到困惑,因为他没有得到错误,但结果是错误的。
所以,我需要的是一个可选的表达式(因此可以完全省略),但如果格式不正确,则会抛出 ParseException
。
尝试在解析每一行时将 parseAll
设置为 True
,例如expression.parseString(line, parseAll=True)
。如果整行不匹配,这将引发 ParseException
异常。
有关更多信息,请参阅 the "Using the pyparsing module" page。
我正在使用 PyParsing 库来定义我自己的 SQL-like 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)
最后一个表达式不匹配但也没有抛出异常。它只是 returns 一个空结果。
我的目标: 我的 DSL 中的一个 "query" 由
形式的多个表达式组成[column] [operator]([parameter],...)
不允许双胞胎。此外,所有可能的表达式都是可选的(因此空查询是完全合法的)。
我的问题: 如果其中一个表达式格式不正确,当前方法不会抛出错误。因为都是Optional
,如果不完全匹配,直接忽略。这让用户感到困惑,因为他没有得到错误,但结果是错误的。
所以,我需要的是一个可选的表达式(因此可以完全省略),但如果格式不正确,则会抛出 ParseException
。
尝试在解析每一行时将 parseAll
设置为 True
,例如expression.parseString(line, parseAll=True)
。如果整行不匹配,这将引发 ParseException
异常。
有关更多信息,请参阅 the "Using the pyparsing module" page。