在一个报表审核软件项目中需要计算字符串表达式的值(例如"1+2/3")。同时,在编制审核规则时也需要获取审核表达式是否存在语法错误。于是,在国内外网上搜索了几个免费组件,感觉都不太好灵活实用。也使用了网上介绍的基于JScript.NET的表达式计算方法(本质上是模拟Javascript计算表达式),代码异常简短且能获取表达式的值,但不能满足项目需求:
- 不能确定表达式或其子项计算后的数据类型。
- 不支持自定义函数,如常见的数值计算函数Truncate和字符处理函数Substr等。起因是,审核软件中要判断某个字符型数据是否含空格、是否含非可见字符等,或根据某个标志位判断一个数据与另一个数据是否匹配。
- 不能自定义常见的iif(e1,e2,e3)函数和if e1 then e2 else e3结构。
- 不能使用{n}占位符的参数计算形式,应用缺乏灵活性。
- 不能自定义运算符。特别,定义符合中文习惯的小于等于(≤)、大于等于(≥)和不等于(≠)运算符,以及更好理解的and/or逻辑表示。这个基于考虑,审核规则表达式不仅我们要能看懂,更需要软件使用者能看懂!例如1>=2 && 5<=6就不及1≥2 and 5≤6好理解。
- 计算出现异常时直接抛出错误,无法内部捕获,例如表达式错误、数据被0除、数据溢出等。
总之,能找到的现有免费组件和方法不能满足灵活性应用需求。于是,在2015年春节前编写了一组TExprParser类(其dll库文件和测试程序可以到csdn下载),基本满足了上述需求,具体介绍如下:
1、名称空间、类版本及其构造函数
全部类位于名称空间CSUST.Data.Expr中,可以直接使用的类有如下四个版本(基类为TExprChecker)和一个检测类(TExprChecker):
- 核心版:TExprParserKernal。该版本的表达式使用c/c++/c#的语法,支持常规数学计算(+-*/^,其中^是幂计算)、关系计算(==、!=、>=和<=)、逻辑计算(&&、||),支持两个数学单目运算符(+-)和一个逻辑非单目运算符(!)。运算符的优先级别和结合方法与c/c++/c#的运算符相同。注意,该