首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理表达式解析器中的一元减数和幂运算

如何处理表达式解析器中的一元减数和幂运算
EN

Stack Overflow用户
提问于 2018-12-04 06:59:05
回答 1查看 1.3K关注 0票数 0

我知道指数比一元减法有更高的优先级。然而,如果我构建一个基于此的表达式解析器,我仍然不能解析像2-3这样的表达式。为了处理这些问题,我还发现,我还需要在要素生产规则中添加一元减号处理,这个规则比指数要高一个优先级。这就是一元减除通常是如何处理的吗?我没有在网上或书中找到任何关于这种特殊情况的东西。我想知道做指数运算和一元运算是否有相同的优先级,你能帮上忙吗?

我正在手工制作一个递归下降解析器,我尝试将功能和一元生产规则合并在一起,但它似乎不起作用。下面的EBNF起作用了

代码语言:javascript
复制
factor        = '(' expression ')' | variable | number | '-' factor
power         = factor { '^' factor } 
unaryTerm     = ['-' | '+'] power
term          = unaryTerm { factorOp unaryTerm }
expression    = term { termOp term }

 termOp        = '+' | '-'
 factorOp      = '*' | '/'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 14:45:31

除非您有不寻常的要求,否则将一元减号和幂运算放在同一个非终端中都会很好,因为指数是正确的关联:(Yacc/bison语法)

代码语言:javascript
复制
atom: ID
    | '(' expr ')'
factor
    : atom
    | '-' factor
    | atom '^' factor
term: factor
    | term '*' factor
expr: term
    | expr '+' term
    | expr '-' term

实际上,实数化是正确关联的,这实际上是语法有意义的必要条件.考虑另一种选择,使用左结合运算符。

假设我们有两个操作符,⊕和≀,⊕的关联和绑定比≀更紧密,因此⊕是≀(a ⊕ b)

由于a ⊕ b ⊕ c是左关联的,所以我们希望将⊕解析为(a ⊕ b) ⊕ c。但后来我们发现了一个奇怪的现象。a ⊕ ≀ b ⊕ c是与(a ⊕ ≀b) ⊕ c)相同还是与a ⊕ ≀(b ⊕ c))相同?这两种选择似乎都违反了简单的模式。注1

当然,可以为每一种情况编写一个明确的语法,但是对于一个刚刚按优先级图编写的程序员来说,哪一个语法不那么令人惊讶呢?最有可能的结果是样式要求≀表达式始终是完全括号的,即使括号是多余的。(C风格指南中充满了这样的建议,许多编译器会指责您使用正确但“不直观”的表达式。)

备注:

  1. 如果您使用优先级声明,您将得到a ⊕ ≀(b ⊕ c)),这可能是直观的,也可能不是直观的,这取决于您的直觉。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53607313

复制
相关文章

相似问题

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