A008.内测.四则运算求值器
迷你的四则运算求值器,支持+ - * / =
五种符号。
@陈宝仪 / 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
测试
参考资料
题图:Diehl Transmatic计算器。在电子计算器没有生产出来之前,人们用老式的机械计算器。