简约的 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 variablea 是一个 variableOR 是一个 operator。所以接下来要匹配的是 variable.


也许你想要的是:

expr = term (operator term)*
term = (lpar expr rpar) / variable