3

更深入地研究语法和 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 )orterm吗?
为什么它选择规则variable代替(当然失败了)?

4

1 回答 1

3

中的第一件事expr是 a term,所以这就是解析器要查找的内容。

您的语法中的Aterm

( term )

或者

variable operator variable

输入是

a OR (b AND c)

这不是以 a 开头的,(所以它可以是 a 的唯一方法term是匹配variable operator variablea是一个variableOR是一个operator。所以接下来要匹配的是variable.


也许你想要的是:

expr = term (operator term)*
term = (lpar expr rpar) / variable
于 2019-02-26T20:49:36.513 回答