我知道指数比一元减法有更高的优先级。然而,如果我构建一个基于此的表达式解析器,我仍然不能解析像2-3这样的表达式。为了处理这些问题,我还发现,我还需要在要素生产规则中添加一元减号处理,这个规则比指数要高一个优先级。这就是一元减除通常是如何处理的吗?我没有在网上或书中找到任何关于这种特殊情况的东西。我想知道做指数运算和一元运算是否有相同的优先级,你能帮上忙吗?
我正在手工制作一个递归下降解析器,我尝试将功能和一元生产规则合并在一起,但它似乎不起作用。下面的EBNF起作用了
factor = '(' expression ')' | variable | number | '-' factor
power = factor { '^' factor }
unaryTerm = ['-' | '+'] power
term = unaryTerm { factorOp unaryTerm }
expression = term { termOp term }
termOp = '+' | '-'
factorOp = '*' | '/'发布于 2018-12-04 14:45:31
除非您有不寻常的要求,否则将一元减号和幂运算放在同一个非终端中都会很好,因为指数是正确的关联:(Yacc/bison语法)
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风格指南中充满了这样的建议,许多编译器会指责您使用正确但“不直观”的表达式。)
备注:
a ⊕ ≀(b ⊕ c)),这可能是直观的,也可能不是直观的,这取决于您的直觉。https://stackoverflow.com/questions/53607313
复制相似问题