用 python 做了个解释器,其他部分做得都还可以,到了这一部分不知道怎么做,现在只能不考虑优先级,一路平推,所以来 V2EX 问一下。 比如(58 + 6**87/7)/a(7,9...0)
1
Cheez OP 挽尊
|
2
sleeepyy 2018-09-25 17:22:52 +08:00 1
建议搜索:逆波兰表达式 or 用栈实现计算器
|
3
vincenteof 2018-09-25 17:41:59 +08:00
按照算符优先级去生成相应的语法树就行了
|
4
inhzus 2018-09-25 17:56:34 +08:00 via Android
简单点的话 设置运算符优先级,遇到括号递归或用栈实现,GitHub 上计算器很多的
复杂点的话,就涉及到编译原理的上下文无关语法,就不是一下能说清的了 |
5
AlisaDestiny 2018-09-25 19:56:59 +08:00
https://blog.gentlehu.com/2014/09/nyoj35-expression-evaluation/
参考这个。源程序是为了解决 nyoj 第 35 题表达式求值。 |
6
xpresslink 2018-09-26 09:37:48 +08:00
去看看 pypy 的源码,这个是用的 R-Python 实现的 python JIT
http://pypy.org/ |
7
agagega 2018-09-26 12:00:31 +08:00
让优先级高的作为文法的上一级,比如:
term := factor '+' factor factor := element '*' element 另一个你需要考虑的问题是结合性,这个用循环就可以搞定。 |