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 )term?
代わりにルールを選択するのはなぜですかvariable(もちろん失敗します)?

4

1 に答える 1