经过不懈努力初步完成表达式计算引擎,也算是在cnblogs上的第一篇文章。
第一次在cnblogs发文,这篇文章也算是实用性的吧,不知首页是否欢迎些类文章,如有建议,我会参考的。
前段时间需要用到表达式计算,在网上搜了一圈,结果都是java的。.net里有的用codedom,有的用datatable的计算列,还有用Com下的Script引擎,愣没找到一个轻量级的独立表达式计算引擎。哎,dotnet的东东是不多,牛人也不屑做这玩意。不过我觉得这表达式引擎用到的地方还是挺多的呀,ms的Datatable就用了不是。
俺在程序员里也就是个半桶水,只好不畏艰难,从头做起。手边一本数据结构就开始了。一开始用栈,再用波兰表达式,再用递归降序,头也大了。总算折腾半天也算有所长进,终于有一天我见到了ANTLR,好象也是在cnblogs这里,这是个好东东,是个分析程序生成器,有兴趣的朋友去www.antlr.org看看吧。用ANTLR我重写了表达式计算引擎,实现了基本功能,并将继续完善。基于我自己的痛苦经历,我将共享该组件,人家ANTLR就是共享的(好象到少有10年了),老外的精力可够猛,我等还在到处混饭吃啊。 先贴个示例的图吧:
下面就说明一下表达式计算引擎目前实现的功能:
① 支持四则运算+,-,*,/,pow和一元+,-
② 支持变量,变量可以是任意类型
③ 支持函数,引擎内部函数或外部函数(外部函数的调用是通过委托实现的)
④ 支持对象的公共成员,包括方法(method)、属性(property)、索引器和字段(field)
源代码说明:
c#,使用用VS2003,在Vs2005下也可以用
工程中有3个项目,AntlrExp,WfcExp,WfcExpText
AntlrExp:由ANTLR自动生成的分析程序
WfcExp:自定义的对AntlrExp的包装和实现
WfcExpTest:表达式计算演示说明
AntrlExp中的代码基本是不用去改动的,我把他单立为一个项目就是这个目的,可以单独打包为一个运行时dll。WfcExp是对AntrlExp的包装,使得表达式引擎在源码级可以任意扩展。其中IOperator接口很重要,该接口定义了表达式引擎的运算操作,只需实现IOperator接口,即可实现自定义的运算操作。
具体的结构可以自己看源代码。详细的文档以后有空时估计会写一下。
接下去的目标:
① 支持关系运算
② 支持字符串常数和日期型常数
③ 在些基础上构造一个简单的脚本引擎
下载源代码(包括演示项目)