表达式解析引擎的设计

前言

表达式的计算是一个一般性的问题。在报表领域,经常会出现支持计算公式的需求。MS Office Excel中的函数计算就是一个很好的参考例子。

本文提供一个表达式引擎的设计方案,能够满足报表领域的复杂计算要求。

 

一个良好的表达式引擎应该支持基本的二元运算和函数调用,而且二元运算能够嵌套函数调用,函数调用也能够嵌套二元运算,比如:

例子1:=2>1&&((Num(1)+2*Num((Num(2)+2)*3/Num(2)))/2>0||2>1)&&0>1,执行结果:0

例子2:=Switch(Num(1),是, Num(0),否),执行结果:是

例子3:=Switch(20<10,1 ,20>=10, 20 + 20*0.1),执行结果:22

 

当然,实际的应用里,表达式中要支持变量的绑定,比如:

例子1(计算税后金额):=Fields!数量.Value * Fields!单价.Value*(1 + Fields!税率.Value / 100)

例子2(不同价格不同税后金额):=Fields!数量.Value*Fields!单价.Value*Switch(Fields!单价.Value<100, 1.1, Fields!单价.Value<500, 1.08, Fields!单价.Value<800, 1.07)

 

至于常用的一元运算,能够通过函数调用就很方便的实现,例如:取非,Not(exp1)。

 

表达式的定义

要支持二元运算能够嵌套函数调用,函数调用也能够嵌套二元运算,需要采用解析器设计模式,定义数个表达式对象,用表达式对象树来描述表达式字符串。

值表达式:用来描述一个常量或变量,例如:1.1,Fields!数量.Value,Parameters!经手人.Value,字符串

二元表达式:用来描述一个二元运算,例如:exp1 + exp2,exp1

函数表达式:用来描述一个函数调用,例如:Num(exp1),Sum(exp1), Switch(cond1, proc1, cond2, proc2…)

 

运算符优先级

运算符优先级很重要,决定了运算的顺序,特别是括号,能够改变表达式的运算顺序。

优先级

运算符

说明

-1

(

左括号

-1

)

右括号

-2

^

幂运算

-3

*

-3

/

-3

%

取余

-4

+

-4

-

-5

<

小于

-5

<=

小于等于

-5

>

大于

-5

>=

大于等于

-6

==

等于

-6

!=

不等于

-7

&&

逻辑与

-8

||

逻辑或

 

表达式引擎的工作流程

 

二元运算解析生成后缀表达式数组的过程

中缀表达式解析成后缀表达式的方法如下,要借用一个临时堆栈stack,输出是后缀表达式数组output:

(1)从右向左依次读取表达式字符串str。

(2)如果str是操作数(常量或变量),输出到output。

(3)如果str是运算符(含左右括号),则做以下判断:

    a) 如果str = '(',放入堆栈stack。

    b)如果str = ')',依次弹出堆栈stack中的运算符输出到output,直到遇到'('为止。

    c)如果str不是')'或者'(',那么就和堆栈stack顶点位置的运算符top做优先级比较。

      1)如果top是'('或者str优先级比top高,那么将str放入堆栈stack。

      2)如果str优先级低于或者等于top,那么输出top到output,然后将str放入堆栈stack。

(4)如果表达式字符串已经读取完成,而堆栈stack中还有运算符时,依次由顶端输出到output。

 

后缀表达式数组生成表达式对象树的过程

计算后缀表达式的方法如下,要借用一个临时堆栈stack:

(1)从左向右扫描后缀表达式数组,依次取出一个数组元素data。

(2)如果data是表达式,就压入堆栈stack。

(3)如果data是运算符,就从堆栈stack中弹出此运算符需要用到的表达式的个数(二元运算符需要2个),创建一个新二元表达式,然后把二元表达式压入堆栈stack。

(4)如果数组处理完毕,堆栈stack中最后剩余的表达式就是最终结果。

 

例如,表达式=(Num(1)+2*Num(Num(2)+2*3/Num(2)))/2,生成的后缀表达式数组如下:

0:    Method{num, [Const(1)]}

1:    Const(2)

2:    Method{num, [Binary{+, Method{num, [Const(2)]}, Binary{/, Binary{*, Const(2), Const(3)}, Method{num, [Const(2)]}}}]}

3:    *

4:    +

5:    Const(2)

6:    /

该后缀表达式数组生成的表达式对象树如下:

Binary{/, Binary{+, Method{num, [Const(1)]}, Binary{*, Const(2), Method{num, [Binary{+, Method{num, [Const(2)]}, Binary{/, Binary{*, Const(2), Const(3)}, Method{num, [Const(2)]}}}]}}}, Const(2)}

 

剩下的工作就是执行表达式对象树,输出结果。

转载于:https://www.cnblogs.com/csguo/p/7614884.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 表达式解析引擎(tevaluator)是一种用于解析和计算数学表达式的工具。它可以接收一个数学表达式作为输入,并将其转化为计算机可执行的代码,然后执行计算得出结果。 tevaluator具有以下特点和功能: 1. 强大的数学表达式支持:tevaluator可以处理各种常见的数学运算符,如加减乘除、指数、取余等。它也支持复杂的函数调用和嵌套表达式,例如三角函数、对数函数等。 2. 变量和常量支持:tevaluator可以处理变量和常量的定义和使用。用户可以定义一个或多个变量,并在表达式中引用这些变量。变量可以在运行时进行赋值,从而实现动态计算。 3. 错误处理和异常处理:tevaluator能够检测和处理错误和异常情况。如果输入的表达式有语法错误或运行时错误,tevaluator会提示相应的错误信息。 4. 高性能和可扩展性:tevaluator经过优化,能够以高效的方式解析和计算表达式。它也具备良好的可扩展性,可以轻松地扩展支持新的函数和运算符。 使用tevaluator可以方便地进行数学表达式的计算。它可以应用于各种场景,例如科学计算、数据分析、游戏开发等。通过简单地调用API,用户可以轻松地集成tevaluator到自己的应用程序中,从而实现对数学表达式解析和计算。 ### 回答2: 表达式解析引擎(tevaluator)是一个用于解析和计算数学表达式的工具。它能够将输入的表达式转换为计算机可执行的代码,并实现相应的计算。tevaluator具有以下特点和功能。 首先,tevaluator具有高度的灵活性和扩展性。它支持多种数学运算符和函数,包括加减乘除、指数、对数、三角函数等等。同时,它还支持变量和常量的定义和使用,使得我们可以灵活地处理复杂的表达式,并根据实际需要进行各种计算。 其次,tevaluator具备良好的错误处理能力。它能够检测并报告输入表达式中的语法错误或计算上的问题,例如括号不匹配、除数为零等等。这样可以帮助开发者及时发现和纠正错误,提高代码的健壮性和可靠性。 另外,tevaluator还支持表达式的优化和简化。它能够自动识别和应用一些常见的计算规则和等价变换,从而简化表达式并提高计算效率。这个特性在处理大型、复杂表达式时尤为重要,可以节省计算资源并提高程序的运行速度。 最后,tevaluator的应用十分广泛。它可以被集成到各种应用中,例如科学计算软件、统计分析工具、图像处理程序等等。无论是在学术研究、工程设计还是日常生活中,我们都可以利用tevaluator来进行各种数学计算,提高工作效率和精确度。 综上所述,表达式解析引擎tevaluator是一个强大的工具,它能够解析、计算和优化数学表达式。它不仅具有灵活性和扩展性,还具备错误处理能力和优化算法。tevaluator的应用范围广泛,可以帮助我们进行各种数学计算,提高工作效率和精确度。 ### 回答3: 表达式解析引擎是一种能够解析和计算数学或逻辑表达式的软件工具。而tevaluator(表达式解析引擎)是其中一种很有用的实现。 tevaluator使用相应的算法和数据结构来解析和计算各种类型的表达式。它可以处理包括常数、变量、运算符、函数等在内的多种元素。用户可以输入一个表达式,tevaluator会将其分解为原子的组件,并按照一定规则进行计算和求解。它可以对复杂的表达式进行分析,并给出计算结果。 tevaluator有很多应用领域,包括数学、科学计算、编程、金融等。在数学中,它可以用于求解复杂的数值或符号运算,对方程进行求解,进行符号计算等。在科学计算中,tevaluator可以用于处理科学实验数据,进行统计分析,计算模型中的参数等。在编程中,它可以用于解析和计算复杂的数学表达式,执行用户自定义的函数等。在金融领域,它可以用于进行复杂的财务计算,如利息计算、期权定价等。 总之,tevaluator作为一种表达式解析引擎,具有非常强大的计算能力和广泛的应用范围。它能够解析和计算各种表达式,帮助用户进行数学或逻辑运算,从而在不同领域提供了方便和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值