JEP(Java Expression Parser)学习笔记
By shenweifeng
2012-9-25 in HangZhou
JEP
基本用法
1、 入门 2、 错误处理 3、 计算表达式
4、 替代的解析和计算方法 5、 缩略的乘法
入门
在项目中使用JEP的类包是很简单的!下面的步骤将会使用很快入门。 1、 下载JEP 包,下载格式为ZIP 2、 解压缩该包
3、 移动jep-x.x.x.jar到你选择的目录中
4、 重要:为了当编译你的程序时Java编译器能找到jep类,编译器需要知道jep的位
置。所以你需要添加.jar文件的路径到你的CLASSPATH环境变量中。(如果你不清楚如何使用,请读这里);你的CLASSPATH变量应该包含某些东西如
C:\\java\\packages\\jep-x.x.x.jar,取决于你jar包放置的位置。或者,你也许需要在你的JAVA IDE中设置jar包的位置,使编译器能找到类库。
5、 在你的程序中,创建一个解析器对象,如:
org.nfunk.jep.JEPmyParser = new org.nfunk.jep.JEP();
6、 添加标准函数和常量,如果你想有能力使用三角函数和pi,e计算表达式。 myParser.addStandardFunctions(); myParser.addStandardConstants();
7、 通常情况下,你需要具体指明哪些变量能在表达式中被使用。如果一个变量在表达式被
解析时还没被添加,解析器将声明表达式是不合法的(这种情况能被改变通过使用 允许未声明的变量)。 添加变量x并且初始化为0, myParser.addVariable(\;
8、 解析表达式并计算它
myParser.parseExpression(ExpressionString); result = myParser.getValue();
9、 变量值可以通过addVariable(String, double)改变
样本小应用程序提供了更多更广泛的表现来展示解析器的使用。
错误处理
错误可能发生在解析表达式过程中,也可能发生在计算表达式过程中。方法handError()将报告一个错误是否已经发生在最近的行为中(或解析,或计算)。如果返回值是true,你能使用getErrorInfo()方法获得已发生错误的进一步错误信息。
计算表达式
4个计算表达式的方法是可以获得的:
? getValue(): 当你期望一个正常的浮点运算值时使用 ? getComplexValue():当你期望一个复数时使用
? getValueAsObject():返回结果为一个对象(任意类型)
? evaluate(Node root):从根节点计算一颗树(一种数据结构)并且返回一个对象。
前两种方法内在也算是getValueAsObject(),通过一些必须地转换就能变成double类型或者Complex类型。
替代的解析和计算方法
有一种替代方法解析和计算表达式,该方法为计算机应用提供了更多的灵活性,特别是在处理一系列相关的等式时。它们是:
public Node parse(String expression) throws ParseException public Object evaluate(Node node) throws Exception 分别解析和计算表达式。这些能被使用如下: try { 量 }
j.evaluate(node1);
Node node2 = j.parse(\Object val2 = j.evaluate(node2); System.out.println(\// Alternative syntax
Node node1 = j.parse(\实际使用中需要打开允许赋值和使用未声明变
catch(ParseException e) { }
catch(Exception e) }
因此,它更容易记录一系列等式。注意使用这种语法,异常需要被捕获而且getTopNode() 方法将不返回有意义的值。
{
System.out.println(\System.out.println(\
缩略的乘法
你能使用缩略的乘法通过使用setImplicitMul(true)。
默认的设置是false(没有缩略乘法)。
缩略乘法允许表达式例如“2 x”能被解释为“2*x”。注意两个变量之间的空格是必须的使它们被解释为乘法。这同样适用于变脸后跟随一个数字。举个例子“y 3”被解释为“y*3”,但是y3被解释为单个名为y3的变量。如果一个数字位于变量之前,它们之间的空格是不需要的,缩略乘法照样有效。
变量
? ? ? ? ?
基础
允许未声明的变量 获得变量队列
赋值(Assignment) 变量观察者
基础
变量有两种处理方式可供选择: 1、 不允许未声明的变量(默认):在这种情况下,解释一个表示式前添加表达式中的变量
时必须的。添加通过使用addVariable()方法实现。
2、 允许未声明的方法:如果你允许未声明的变量,它们将在表达式被解析时自动地添加到
符号表(symbol table)中。
在一个表达式已经被解析后,变量值可以通过使用addVaribale()或setVariable()方法来进行更新。这样就允许使用不同的值对表达式进行重复计算。
一个变量的值可以通过使用getVarValue()方法进行查询。一个更进一步的方法是使用getVar() ,返回一个代表该变量的对象。
这里的变量可能是常量,即不能改变值。添加一个新的常量使用addConstant,添加一个新的变量使用addVariable;
符号表类(SymbolTable)存储代表变量的对象而不仅仅是它们的值。该类的get和put已经过时,不赞成使用。这导致一个运算上的细微提高。
允许未声明的变量
使其能够解析未声明的变量,使用方法setAllowUndeclared(true)。
默认的设置是false(不允许未声明的变量)。
如果你不清楚声明变量名将会出现在将要解析的表达式中,你可以使用setAllowUndeclare(true)。设置该选择后,解析表达式前将变量添加到表达式中将不是必须的了。当解析时如果一个新变量被发现,它被自动的添加到符号表中。看获得变量队列,你可以读到有关怎么访问这些变量的方式。
获得变量队列
在未声明对象允许的情况下解析表达式,变量和常量队列被添加进解析器中,可以通过方法 getSymbolTable获得。该方法是最有效的当未声明变量选项被选中后。方法返回值是一个SymbolTable对象。注意SymbolTable继承HashTable。
赋值(Assignment)
赋值允许变量的值被设置通过使用等式中的“=”操作符,这样,执行操作例如x=3,
Y=x^2,然后y将获得值9。赋值能被使用通过标准的JEP包,没有需要用到org.lsmp.djep树中的任何包。为了打开赋值功能,JEP的方法setAllowAssignment(true)需要调用。 // standard initialisation JEP j = new JEP(); j.addStandardConstants(); j.addStandardFunctions(); j.addComplex(); j.setAllowUndeclared(true); j.setImplicitMul(true); // switch assignment facilities on
相关推荐: