Копаясь глубже в грамматику и 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
(что, конечно, не получается)?