简约的 ParseError
Parsimonious ParseError
特别是深入研究语法和 PEG,我想要一个具有以下语法的 DSL:
a OR (b AND c)
我在这里使用 parsimonious
,语法如下:
from parsimonious.grammar import Grammar
grammar = Grammar(
"""
expr = (term operator term)+
term = (lpar term rpar) / (variable operator variable)
operator = and / or
or = _? "OR" _?
and = _? "AND" _?
variable = ~r"[a-z]+"
lpar = "("
rpar = ")"
_ = ~r"\s*"
"""
)
print(grammar.parse('a OR (b AND c)'))
但是,上面的文本
失败了
parsimonious.exceptions.ParseError: Rule 'variable' didn't match at '(b AND c)' (line 1, column 6).
为什么?我不是把 term
指定为 ( term )
或 term
了吗?
为什么它选择 variable
的规则(当然失败了)?
expr
中的第一件事是 term
,这就是解析器要查找的内容。
你语法中的 term
是
( term )
或
variable operator variable
输入是
a OR (b AND c)
它不是以 (
开头,所以它可以是 term
的唯一方法是匹配 variable operator variable
。 a
是一个 variable
; OR
是一个 operator
。所以接下来要匹配的是 variable
.
也许你想要的是:
expr = term (operator term)*
term = (lpar expr rpar) / variable
特别是深入研究语法和 PEG,我想要一个具有以下语法的 DSL:
a OR (b AND c)
我在这里使用 parsimonious
,语法如下:
from parsimonious.grammar import Grammar
grammar = Grammar(
"""
expr = (term operator term)+
term = (lpar term rpar) / (variable operator variable)
operator = and / or
or = _? "OR" _?
and = _? "AND" _?
variable = ~r"[a-z]+"
lpar = "("
rpar = ")"
_ = ~r"\s*"
"""
)
print(grammar.parse('a OR (b AND c)'))
但是,上面的文本
失败了parsimonious.exceptions.ParseError: Rule 'variable' didn't match at '(b AND c)' (line 1, column 6).
为什么?我不是把 term
指定为 ( term )
或 term
了吗?
为什么它选择 variable
的规则(当然失败了)?
expr
中的第一件事是 term
,这就是解析器要查找的内容。
你语法中的 term
是
( term )
或
variable operator variable
输入是
a OR (b AND c)
它不是以 (
开头,所以它可以是 term
的唯一方法是匹配 variable operator variable
。 a
是一个 variable
; OR
是一个 operator
。所以接下来要匹配的是 variable
.
也许你想要的是:
expr = term (operator term)*
term = (lpar expr rpar) / variable