解释器如何处理运算符优先级?

2018-09-25 17:16:33 +08:00
 Cheez

用 python 做了个解释器,其他部分做得都还可以,到了这一部分不知道怎么做,现在只能不考虑优先级,一路平推,所以来 V2EX 问一下。 比如(58 + 6**87/7)/a(7,9...0)

2660 次点击
所在节点    Python
7 条回复
Cheez
2018-09-25 17:17:21 +08:00
挽尊
sleeepyy
2018-09-25 17:22:52 +08:00
建议搜索:逆波兰表达式 or 用栈实现计算器
vincenteof
2018-09-25 17:41:59 +08:00
按照算符优先级去生成相应的语法树就行了
inhzus
2018-09-25 17:56:34 +08:00
简单点的话 设置运算符优先级,遇到括号递归或用栈实现,GitHub 上计算器很多的
复杂点的话,就涉及到编译原理的上下文无关语法,就不是一下能说清的了
AlisaDestiny
2018-09-25 19:56:59 +08:00
https://blog.gentlehu.com/2014/09/nyoj35-expression-evaluation/
参考这个。源程序是为了解决 nyoj 第 35 题表达式求值。
xpresslink
2018-09-26 09:37:48 +08:00
去看看 pypy 的源码,这个是用的 R-Python 实现的 python JIT
http://pypy.org/
agagega
2018-09-26 12:00:31 +08:00
让优先级高的作为文法的上一级,比如:

term := factor '+' factor
factor := element '*' element

另一个你需要考虑的问题是结合性,这个用循环就可以搞定。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX