原因
因为想要练习自己的编程能力, 所以打算写一个计算器出来.
具体的需求: – 实现一个支持四则运算的计算器 – 实现括号, 乘方运算
分析
我打算的实现步骤如下: – 实现词法解析器, 把输入的字符串解析成词语. – 实现简单的四则运算语法分析与计算
词法解析器
采用状态机来实现
词法:
number := [0..9] | number [0..9]
add := +
sub := -
mul := *
div := /
lp := (
rp := )
mmu := **
根据词法获得的状态表格:
----------------- -------- --------- ------- -----
statuscondition [0..9] [+-/()] [\*] [ ]
0.start 1 num 0 fac 2 0
1.numcheck 1 num 0 fac 0 0
2.mulcheck 1 num 0 fac 0 mmu 0
----------------- -------- --------- ------- -----
当跳出number状态时, 记录number. 当跳出mulcheck状态时, 记录mul.
四则运算语法分析和处理
先来一个简单的吧, 只实现四则运算, 2次循环, 一次计算*/, 一次计算+–, 然后打印出结果.
实现完成, 函数是caculate.
然后是能够实现括号, 乘方等复杂操作, 这个需要语法分析, 甚至可能用到AST(抽象语法树)
语法
prime := ( p3 ) | number
p1 := prime ** prime | prime
p2 := p2 * p1 | p2 / p1 | p1
p3 := p3 - p2 | p3 + p2 | p2
自己研究了半天, 最后还是看the c programming language里面的解法完成了.
总共花费了1天, 看起来过了一个有意义的中秋(好悲哀).