我知道幂运算的优先级高于一元负。但是,如果我以此为基础构建表达式解析器,我仍然无法解析2-3这样的表达式。为了处理这些问题,我还发现我还需要在因子生成规则中添加一元减处理,该处理要比幂运算高一个优先级。这通常是如何处理一元减法和除法运算的吗?我没有在网上或书中找到任何有关这种情况的书。我想知道让幂运算和一元运算符具有相同的优先级对您有帮助吗?
我正在手工设计递归下降解析器,我尝试将幂和一元生产规则合并在一起,但是似乎没有用。起作用的是以下EBNF
factor = '(' expression ')' | variable | number | '-' factor
power = factor { '^' factor }
unaryTerm = ['-' | '+'] power
term = unaryTerm { factorOp unaryTerm }
expression = term { termOp term }
termOp = '+' | '-'
factorOp = '*' | '/'
答案 0 :(得分:1)
除非您有非同寻常的要求,否则将一元减号和幂运算都放在同一个非终结符中会很好,因为幂运算是右相关的:(Yacc /野牛语法)
atom: ID
| '(' expr ')'
factor
: atom
| '-' factor
| atom '^' factor
term: factor
| term '*' factor
expr: term
| expr '+' term
| expr '-' term
实际上,实际上要求幂是右相关的,此语法才有意义。考虑使用左关联运算符的替代方法。
假设我们有两个运算符⊕和≀,其中⊕与≀的缔合和绑定关系更紧密,因此≀ a ⊕ b
为≀(a ⊕ b)
。
由于⊕保持关联性,因此我们希望将a ⊕ b ⊕ c
解析为(a ⊕ b) ⊕ c
。但是后来我们变得奇怪了。 a ⊕ ≀ b ⊕ c
与(a ⊕ ≀b) ⊕ c)
相同还是与a ⊕ ≀(b ⊕ c))
相同?这两个选项似乎都违反了简单的模式。 [注1]
当然,可以为每种情况编写明确的语法,但是对于仅使用优先级图表的程序员而言,哪一个语法会不足为奇?最有可能的结果是样式要求,即使括号是多余的,≀表达式也始终要完全加上括号。 (C风格指南中充斥着这样的建议,许多编译器会因使用正确但“不直观”的表达式而责备您。)
a ⊕ ≀(b ⊕ c))
,根据您的直觉,它可能是直观的,也可能不是直观的。