首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简约ParseError

简约ParseError
EN

Stack Overflow用户
提问于 2019-02-26 19:53:18
回答 1查看 231关注 0票数 3

更深入地研究语法和特殊的PEG,我希望有一个具有以下语法的DSL:

代码语言:javascript
复制
a OR (b AND c)

我在这里使用的是parsimonious,语法如下:

代码语言:javascript
复制
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)'))

但是,对于上面的文本,这是失败的。

代码语言:javascript
复制
parsimonious.exceptions.ParseError: Rule 'variable' didn't match at '(b AND c)' (line 1, column 6).

为什么?我不是把term指定为( term )还是term吗?

为什么它会选择variable的规则(当然会失败)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-26 20:49:36

expr中的第一件事是一个term,所以这就是解析器所要寻找的。

语法中的term

代码语言:javascript
复制
( term )

代码语言:javascript
复制
variable operator variable

而输入是

代码语言:javascript
复制
a OR (b AND c)

这并不是从(开始的,所以它可以成为term的唯一方法是,如果它与variable operator variable匹配。avariableORoperator。接下来要匹配的是variable

也许你想要的是:

代码语言:javascript
复制
expr = term (operator term)*
term = (lpar expr rpar) / variable
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54893073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档