比ANTLR自带calc示例的稍微复杂一点的C#表达式求值器(expression evaluator)
ANTLR在国内现在比较火了,主要是Hibernate用了ANTLR做HQL到SQL的语法处理转换,园子里Andy Wu已经有了一个比我强一点表达式计算引擎,但奇怪的是,他的公开代码并没有包括*.g文件。上网也找了好多资料,似乎国内ANTLR应用多数都还停留在初级阶段,国外真正好的初学者教材也很少,所以很期待ANTLR的Terence Parr新书The Definitive ANTLR Reference:Building Domain-Specific Languages。
我花了2天时间看了看ANTLR,做些技术储备,这里提供的表达式求值器是C#版本的,同ANTLR自带的calc示例相比较有下列进步:
- 修改了ANT的*.build,使其符合ANT 1.7版本的语法(ANTLR自带的build文件已经不符合ANT最新语法了),另外,build ANTLR还需要ANT dotNET库支持;
- 增加了一元运算符“-”和“+”;
- 支持括号指定优先级;
- 提升整数INT到浮点FLOAT类型;
- 补全四则运算;
- 增加了乘方^,取模%,运算符。
或者更简单的说,可以计算形如“(10/2) - 3 + (2+2)*4 - 2^3 - -5%+2 +0.2/3 ;”这样的表达式。
我以后还可能会增加一些我能力范围内可以实现的功能,但ANTLR入门简单,但越到后来越难,资料也越少,所以还是无法做出什么担保,毕竟ANTLR是和编译原理相关的,我敢狂妄的说我可以一个月内掌握大多数IT相关的知识和技能,但编译原理么——还是要除外的。
最后以一个提问结尾:
我的calc实现是在原子ATOM中支持括号的:
atom : FLOAT | (LPAREN! sumExpr RPAREN!) ;
因为按照Ashley J.S Mills的Nested Expressions教程总是不对,我怀疑这样做同Ashley的做法相比,会有一些效率上的损失,有人知道么?