爱可深思▼ 2015▼ 内测 Scala 四则运算 求值

008.内测.四则运算求值器

迷你的四则运算求值器,支持+ - * / =五种符号。

@陈宝仪 / 2015-08-01 / CC-BY-SA-3.0

任务说明

要求实现一个可定义变量的四则运算求值器
该求值器支持:
四种操作符 + - * /
赋值操作符 =
为了利于解析,每个操作符的左右必须存在一个空格。
每个赋值表达式用\n分隔。

其精确的E-BNF描述如下

exps  ::= {identifier " = " exp "\n"};  
exp   ::= (ref [(" + " | " - " | " * " | " / ") ref]) | ;  
ref   ::= identifier | number;  

根据上述E-BNF,=号后面不会出现有两个或两个以上操作符的情况
例如

a = b + c / 2  
b = c + d + e  

情景举例

一般形式如下

a = b + c  
b = 1  
c = 1  

对上述a,b,c进行求值的结果为a=2.0, b=1.0, c=1.0

还有如下特殊形式

a = b  
b = c  
c = a 
d = d + 1  
e = e  
f = 5 / 0  

对上述a,b,c,d,e求值
结果为
a=Double.NaN, b=Double.NaN, c=Double.NaN, d=Double.NaN, e=Double.NaN, f=Double.NaN

  • 需要解决循环定义问题,避免出现死循环
  • 需要解决被除数等于0的问题,此时结果为Double.NaN

对于如下形式

a = 1  
a = 2  

我们取得后一条的定义a = 2忽略前一条定义a = 1

答题要求

  • fork exp-eval到你的github目录
  • 实现ExpEval中的evalExp方法
  • 通过TestExpEval测试

参考资料

《008.内测.四则运算求值器》 用Scala实现可定义变量的四则运算求值器。
题图:Diehl Transmatic计算器。在电子计算器没有生产出来之前,人们用老式的机械计算器。