Python中解释器如何处理运算符优先级?
用 python 做了个解释器,其他部分做得都还可以,到了这一部分不知道怎么做,现在只能不考虑优先级,一路平推,所以来 V2EX 问一下。 比如(58 + 6**87/7)/a(7,9...0)
Python中解释器如何处理运算符优先级?
挽尊
Python解释器处理运算符优先级的方式很直接:它遵循一个预定义的优先级规则表。当表达式中有多个运算符时,优先级高的先计算,优先级低的后计算。如果优先级相同,则根据结合性(从左到右或从右到左)来决定顺序。
比如,在表达式 3 + 4 * 2 中,乘法 (*) 的优先级高于加法 (+),所以解释器会先计算 4 * 2 得到 8,然后再计算 3 + 8,最终结果是 11。这和你学过的数学规则是一样的。
如果你想改变默认的计算顺序,就得用括号 ()。括号里的表达式拥有最高的优先级,会被优先计算。例如,(3 + 4) * 2 的结果就是 14。
Python官方的优先级规则表很详细,但常用的记住几个关键点就行:括号最高,然后是乘方 (**),接着是乘除取模 (*, /, //, %),最后是加减 (+, -)。比较运算符(如 ==, >)和逻辑运算符(and, or)的优先级则更低。
总结:记住优先级表或直接用括号来控制顺序。
建议搜索:逆波兰表达式 or 用栈实现计算器
按照算符优先级去生成相应的语法树就行了
简单点的话 设置运算符优先级,遇到括号递归或用栈实现,GitHub 上计算器很多的
复杂点的话,就涉及到编译原理的上下文无关语法,就不是一下能说清的了
https://blog.gentlehu.com/2014/09/nyoj35-expression-evaluation/
参考这个。源程序是为了解决 nyoj 第 35 题表达式求值。
去看看 pypy 的源码,这个是用的 R-Python 实现的 python JIT
http://pypy.org/
让优先级高的作为文法的上一级,比如:
term := factor ‘+’ factor
factor := element ‘*’ element
另一个你需要考虑的问题是结合性,这个用循环就可以搞定。

