JEP 说明文档
目录
JEP 文档 ........................................................................................................................................... 1
一 概述............................................................................................................................................. 4
1.1 特性 ................................................................................................................................... 4
1.2 解析和计算 ........................................................................................................................ 4
1.2.1 解析......................................................................................................................... 4
1.2.2 计算......................................................................................................................... 5
二、基本用法 ................................................................................................................................... 5
2.1 入门指南............................................................................................................................ 5
2.2 错误处理............................................................................................................................ 6
2.3 默认设置............................................................................................................................ 6
2.4 计算方法............................................................................................................................ 6
2.5 快速重复计算 .................................................................................................................... 7
2.6 Decimal 运算 ....................................................................................................................... 7
2.7 隐式乘法............................................................................................................................ 7
2.8 处理多个表达式 ................................................................................................................ 7
2.9 使用 RealEvaluator 快速计算 ............................................................................................ 8
三、变量........................................................................................................................................... 8
3.1 基础 ................................................................................................................................... 8
3.2 未声明和未定义的变量 .................................................................................................... 9
3.3 赋值 .................................................................................................................................... 9
3.4 获取变量列表 .................................................................................................................. 10
3.5 变量观察者 ...................................................................................................................... 10
四、数据类型 ................................................................................................................................. 10
4.1 String ................................................................................................................................. 10
4.2 Vector ................................................................................................................................ 10
4.3 复数 ................................................................................................................................. 11
4.4 自定义类型 ...................................................................................................................... 12
五、操作符..................................................................................................................................... 12
5.1 内建操作符 ...................................................................................................................... 12
5.2 加入操作符 ...................................................................................................................... 13
5.3 为可配置的解析器加入和操作操作符 .......................................................................... 13
5.3.1 修改已存在的操作符 ........................................................................................... 13
5.3.2 优先级和绑定 ....................................................................................................... 13
5.3.3 将操作符加入操作符表 ....................................................................................... 14
5.3.4 标准操作符的绑定和优先级 ............................................................................... 15
5.4 使用标准解析器添加操作符 .......................................................................................... 15
5.4.1 编辑标准的解析器语法 ....................................................................................... 15
5.5 其他操作符集 .................................................................................................................. 16
六、函数......................................................................................................................................... 16
6.1 三角函数.......................................................................................................................... 17
6.2 对数和指数函数 .............................................................................................................. 17
6.3 统计函数.......................................................................................................................... 17
6.4 取整函数.......................................................................................................................... 18
6.5 混合函数.......................................................................................................................... 18
6.6 复数函数.......................................................................................................................... 18
6.7 字符串函数 ...................................................................................................................... 19
6.8 选项函数.......................................................................................................................... 19
七、自定义函数 ............................................................................................................................. 20
7.1 UnaryFunction 和 BinaryFunction .................................................................................... 20
7.2 参数类型转换和异常 ...................................................................................................... 20
7.3 Nary functions ................................................................................................................... 21
7.4 基于 PostfixMathCommand 的栈 ................................................................................... 22
7.5 特殊函数.......................................................................................................................... 23
八、BigDecimal 模式 ...................................................................................................................... 24
8.1 如何使用 BigDecimal 模式 .............................................................................................. 24
8.2 支持的操作符和函数 ...................................................................................................... 24
8.3 BigDecimal 和字符串 ........................................................................................................ 24
九、常见问答 ................................................................................................................................. 25
9.1 为什么 Jep 给定的结果不准确? .................................................................................. 25
9.2 我如何处理 NULL 值? ................................................................................................... 25
9.3 为什么我得到一个 EvaluationException ........................................................................ 26
9.4 我如何允许带点的变量名? .......................................................................................... 26
一 概述
JEP 是一个用于解析和计算数学表达式的 Java 类库。通过使用这个包你可以把公式看
作字符串并快速计算它们。其中内置了大量公共的数学函数和常量供用户使用。另外,你也
可以通过自定义变量、常量、函数等方式扩展 JEP。
1.1 特性
· 占用空间小(281kb 类库)
· 快速计算
·支持任意精度的算术
·支持字符串、向量和复数
·包括常用数学函数和预定义常量
·支持布尔表达式(!, &&, ||, <, >, !=, ==, >=, and <=)
·支持隐式乘法(允许使用“3x”代替“3*x”这种表达式)
·支持赋值表达式(例如 x=5)
·允许选择声明变量或未声明变量
·可扩展的自定义函数
·可定制的语法表达式
·兼容 J2SE 5
·支持字符编码(包括希腊符号)
·丰富的文档
·包括 JavaCC 语法
1.2 解析和计算
使用 JEP 计算一个字符串表达式包括两个步骤,如下图所示。首先是解析表达式,从
字符串结构解析为树形结构。表达式的树形结构表示允许接下来的简单、快速的表达式计算。
接下来将更详细地讨论这两个步骤。
1.2.1 解析
一般来说,可以描述解析作为一系列字符作为输入并产生一组包含字符集合信息的结构
化表示。解析虽然用于其他领域例如自然语言解析等,但是这里的重点是数学表达式。
数学表达式可以通过树形结构表示,其中数字、变量、操作符和函数全部通过节点表示。数
字和字符称为“子节点”,操作符和函数称为“父节点”。父节点操作它的子节点。例如,表达
式“1+2*3”可以表示为一棵包含五个节点的树,如上图所示。
你也许会问为什么“乘”节点是“加”节点的一个子节点。这是运算优先级的原因。当解析
表达式时,需要遵守优先级的顺序。乘法的优先级高于加法的优先级。所以,如上例所示,
它需要在加 1 之前计算 2 乘以 3。在树中,这是由乘法操作符的子节点数字 2 和 3 组成的。
最后,乘法节点自己作为加法节点的一个子节点,计算乘法的结果用于计算加法操作。解析
器按照优先级顺序负责确定语法。
解析器通常使用解析器生成器生成,例如 JavaCC、ANTLR、SableCC、Yacc 或者 Bison。
在众多解析器生成器中,JEP 使用 JavaCC。使用 JccParser 中定义的语法。JavaCC 创建一组
类来执行解析过程的核心任务。一个可配置的 Java 解析器也包括其中。
1.2.2 计算
计算把表达式从一个树形表示转变为一个表达式的值。从树通过操作符优先级建立,计
算方法不需要知道操作符优先级。树可以使用一个简单的方法确定表达式的值来遍历。
一个简单的方法是从树的根节点(最顶层的节点)开始,运用递归方法。这个可以使用访问
者模式来实现。不同的方法可以为每个节点类型创建。计算一个操作或者一个函数节点,首
先子节点要被计算。然后,用子节点的值,操作符或者函数用于确定节点本身的值。常量(数
字)或者变量节点,节点计算常量或者变量的值。使用这样的递归方法迅速地通过深度优先
算法遍历树。
二、基本用法
2.1 入门指南
在你的项目中使用 JEP 非常简单。下面的步骤将帮助你快速开始。
1、下载 JEP 包
2、解压包
3、移动 jep-java-x.x.x.jar 文件(位于主目录)到所选择的目录中
4、重要:当编译程序时,确保 Java 编译器能够找到 JEP 类,它需要知道它们的位置。你需
要设置 IDE 中 jar 的位置来让编译器发现类库(如何去做请查看你的 IDE 帮助手册),如果
你 不 是 用 IDE , 你 需 要 把 jar 加 入 到 你 的 CLASSPATH 环 境 变 量 中 , 例
如 C:\java\packages\jep-java=x.x.x.jar,这取决于你把 jar 放到哪一路径。
5、将以下代码加入到你的程序中。
import com.singularsys.jep.Jep;
import com.singularsys.jep.JepException;
public class Demo {
public static void main(String[] args) {
Jep jep = new Jep();
try {