更深入地研究语法和特殊的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的规则(当然会失败)?
发布于 2019-02-26 20:49:36
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) / variablehttps://stackoverflow.com/questions/54893073
复制相似问题