`
linliangyi2007
  • 浏览: 1004460 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

发布新版IK-Expression开源表达式解析器V2.0.5

阅读更多

Version2.1.0已发布: http://linliangyi2007.iteye.com/blog/462723

Version2.0.5的变更:

 支持表达式的换行编辑,方便表达式编写和阅读,如:
$CALCDATE([2008-03-01],
0,0,
-(10 + (23 - 3) * (4 / 5)) % 6,
0,0,0)


 提供了更多的开放API,如:表达式验证API,这使得表达式在执行前可以检查其语法正确性。

 修订了“?:”三元操作符的“:“号两端对不同类型的数值不兼容的BUG。如:原有版本中,表达 ”100 > 10 ? 100 : 10.5“ 将会抛出“参数类型不兼容“异常;在新版本中,则返回double型的100.0

 变更原有配置文件functionConfig.xml的文件名为IKExpression.cfg.xml

 发布了V2.0.5版本的JavaDoc

详细请参阅RAR包内的《IKExpressoin简易表达式引擎V2.0使用说明.doc》文档

google code 下载地址:http://code.google.com/p/ik-expression/downloads/list




分享到:
评论
33 楼 linliangyi2007 2009-09-05  
lovit 写道
谢谢您的回答,
我们是以下方法去调用的,会出错。。

public static void main(String[] args){   
   Object result = null;
    result = ExpressionEvaluator.evaluate("sayHello(1.0)");   
    System.out.println("Result = " + result);   
    result = ExpressionEvaluator.evaluate("sayHello(1)");   
    System.out.println("Result = " + result);     

}   


以上如“sayHello(1.0)”是在流程中的表达式。您的意思是只能通过楼上的方式去调用吗?因为sayHello中的值,是根据数据库中的数据或上下文的中值取得,配置表达式的时候,根本不知道他是什么类型,只知道他是数字(可能是整形,也可能是浮点型)


新版本已经发布:http://www.iteye.com/topic/462723
32 楼 linliangyi2007 2009-09-05  
lovit 写道
谢谢您的回答,
我们是以下方法去调用的,会出错。。

public static void main(String[] args){   
   Object result = null;
    result = ExpressionEvaluator.evaluate("sayHello(1.0)");   
    System.out.println("Result = " + result);   
    result = ExpressionEvaluator.evaluate("sayHello(1)");   
    System.out.println("Result = " + result);     

}   


以上如“sayHello(1.0)”是在流程中的表达式。您的意思是只能通过楼上的方式去调用吗?因为sayHello中的值,是根据数据库中的数据或上下文的中值取得,配置表达式的时候,根本不知道他是什么类型,只知道他是数字(可能是整形,也可能是浮点型)


马上发布修定版本,谢谢你的建议。
31 楼 lovit 2009-09-05  
谢谢您的回答,
我们是以下方法去调用的,会出错。。

public static void main(String[] args){   
   Object result = null;
    result = ExpressionEvaluator.evaluate("sayHello(1.0)");   
    System.out.println("Result = " + result);   
    result = ExpressionEvaluator.evaluate("sayHello(1)");   
    System.out.println("Result = " + result);     

}   


以上如“sayHello(1.0)”是在流程中的表达式。您的意思是只能通过楼上的方式去调用吗?因为sayHello中的值,是根据数据库中的数据或上下文的中值取得,配置表达式的时候,根本不知道他是什么类型,只知道他是数字(可能是整形,也可能是浮点型)
30 楼 linliangyi2007 2009-09-05  
引用

我的意思是,在eclipse的JAVA环境下,语法检查和编译都可以通过。其实这个功能比较实用,因为在流程条件判断方面,很难确定这个值是整形或浮点形(因为每个单据的业务数据不同),而IK-Exp又不支持重载,如果当IK-Exp要调用的函数参数为Object类型能支持的话,那就太好了,不知道这个功能能不能实现,谢谢!


不是太明白你的意思,个人觉得你没有很细的看IK-Exp的API文档。不多说了,这个给一个Object为参数的例子吧:

1.定义自己的Java方法

/**
 * @author linly
 *
 */
public class TestFunctions {
	/**
	 * 自己定义的以Object为参数的Java方法
	 * @param o
	 * @return
	 */
	public String sayHello(Object o){
		if(o instanceof Integer){
			return "Integer";
		}else if(o instanceof Double){
			return "Double";
		}else{
			return "Float";
		}
	}
}



2.设置IKExpression.cfg.xml,将自定义的方法声明为IK-Exp的函数
<?xml version="1.0" encoding="UTF-8"?>
<function-configuration>
        <!-- 这里省略IK-Exp的内置函数配置罗干。。。-->

	
	<!-- 用户函数配置  请在这里定制您自己的函数-->

	<bean class="org.wltea.expression.test.TestFunctions">
		<function name="问好" method="sayHello">
			<parameter-type>java.lang.Object</parameter-type>
		</function>
	</bean>
</function-configuration>



3.在Java中调用的自己写的函数,实现Object的参数传入
	public static void main(String[] args){

		//定义表达式		
		String expression = "$问好(数字类型)";

		//给表达式中的变量 [数字类型] 付上下文的值
		List<Variable> variables = new ArrayList<Variable>();
		variables.add(new Variable("数字类型" , DataType.DATATYPE_OBJECT , new Integer(100)));

		//执行表达式
		Object result = ExpressionEvaluator.evaluate(expression, variables);
		System.out.println("Result = " + result);
		
                //变更 [数字类型] 的值
		variables.add(new Variable("数字类型" , DataType.DATATYPE_OBJECT , new Double(100)));
		//再次执行表达式
		result = ExpressionEvaluator.evaluate(expression, variables);
		System.out.println("Result = " + result);		
		
	}		


4.执行结果
Result = Integer
Result = Double



OK!!!
29 楼 lovit 2009-09-05  
linliangyi2007 写道
lovit 写道
linliangyi2007 写道
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?

是double类型。也就是说,我有一个函数,定义成Object的参数,IK-Expression下调用时将double类型传入调用的时候,会执行不成功,正常的代码,这个语法应该是支持的。
function void dd(Object a,Object b){

}

double c=0.0;
double d=1.0;

dd(c,d)


是的,你必须把变量声明称Object跟你在函数声明的时候一致。我不知道你的“正常代码这个语法应该是支持”是啥意思,IK-Exp只是一个很轻量级的解析器,它有自己的语法,并不兼容某种语言的,如果你觉得要支持JS或者Java的全部语法,那就期望太高了。你可以看看IK-Exp的项目定位和说明吧。

我的意思是,在eclipse的JAVA环境下,语法检查和编译都可以通过。其实这个功能比较实用,因为在流程条件判断方面,很难确定这个值是整形或浮点形(因为每个单据的业务数据不同),而IK-Exp又不支持重载,如果当IK-Exp要调用的函数参数为Object类型能支持的话,那就太好了,不知道这个功能能不能实现,谢谢!
28 楼 linliangyi2007 2009-09-03  
lovit 写道
linliangyi2007 写道
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?

是double类型。也就是说,我有一个函数,定义成Object的参数,IK-Expression下调用时将double类型传入调用的时候,会执行不成功,正常的代码,这个语法应该是支持的。
function void dd(Object a,Object b){

}

double c=0.0;
double d=1.0;

dd(c,d)


是的,你必须把变量声明称Object跟你在函数声明的时候一致。我不知道你的“正常代码这个语法应该是支持”是啥意思,IK-Exp只是一个很轻量级的解析器,它有自己的语法,并不兼容某种语言的,如果你觉得要支持JS或者Java的全部语法,那就期望太高了。你可以看看IK-Exp的项目定位和说明吧。
27 楼 lovit 2009-09-03  
linliangyi2007 写道
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?

是double类型。也就是说,我有一个函数,定义成Object的参数,IK-Expression下调用时将double类型传入调用的时候,会执行不成功,正常的代码,这个语法应该是支持的。
function void dd(Object a,Object b){

}

double c=0.0;
double d=1.0;

dd(c,d)
26 楼 linliangyi2007 2009-08-25  
lovit 写道
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!


你传入double的时候,变量申明为啥类型啊?
25 楼 lovit 2009-08-25  
我现在就是将参数声明成Object,但传入double类型的时候(因为有时候是integer的),就出现上面的错误。。这种情况怎么处理?谢谢!!
24 楼 linliangyi2007 2009-08-25  
lovit 写道
函数不能重载,所以将函数参数变成Object时,出现----参数类型不匹配,函数类型为:java.lang.Object 传入参数类型为:double


你把函数的参数声明成Object,那么参数就是用Object传入就好了。重载的时候,null型没法处理啊,不知道转成啥
23 楼 lovit 2009-08-25  
函数不能重载,所以将函数参数变成Object时,出现----参数类型不匹配,函数类型为:java.lang.Object 传入参数类型为:double
22 楼 linliangyi2007 2009-07-14  
conservatism 写道
自定义函数的名字不能重复,请问有别的方法可以让IKExpression.cfg.xml中配置的函数能实现重载吗?
比如我想用一个$ABS()来指向我定义的四个版本的abs(),分别是int,long,double和float。
另外在IKExpression.cfg.xml直接配置java.lang.Math中的函数是不可见的?必须要在别的地方声明一个public的函数去调用可以


暂时不能,你只能分别命名为$ABS1()、$ABS2()或者$ABSInt()、$ABSLong()了。
识别方法的重载相当复杂,就IK-EXP的定位而言,实在没有这个必要,呵呵
21 楼 conservatism 2009-07-14  
自定义函数的名字不能重复,请问有别的方法可以让IKExpression.cfg.xml中配置的函数能实现重载吗?
比如我想用一个$ABS()来指向我定义的四个版本的abs(),分别是int,long,double和float。
另外在IKExpression.cfg.xml直接配置java.lang.Math中的函数是不可见的?必须要在别的地方声明一个public的函数去调用可以
20 楼 makemyownlife 2009-07-13  
学习学习啦
19 楼 凯旋人生 2009-07-13  
支持,好好学些下!!!
18 楼 dd2086 2009-07-12  
是个不错的东东
17 楼 city_moon 2009-07-12  
从上一个版本开始,我就一直在关注,希望功能越来越强......
16 楼 linliangyi2007 2009-07-12  
stworthy 写道
请问处理速度有多快?


Good question!

老实说,没有做过专门的性能测试。

只是随我们公司的业务系统做了集成的压力测试,100并发的,没出问题。

IK-EXP的在设计的时候,考虑了多线程,但没有将他定位在高执行效率上。毕竟解析执行的东西,很难设想有非常好的性能表现。

目前,国外有大量优秀的动态语言解析程序,如BeanScript;java 6.0也有完整的js执行包了。IK的定位很简单,可以中文命名变量,中文函数名称,语法接近算术公式;适合于最终用户的使用(有点模仿Excel中的公式吧)。

大家这么热情,我很开心。

但本人还没能力靠个人之力,将其设计成如同Ruby那样强大的动态语言,哈哈,见笑了!
15 楼 YiSingQ 2009-07-11  
谢谢LZ了,刚刚好学习下。。。
14 楼 stworthy 2009-07-11  
请问处理速度有多快?

相关推荐

Global site tag (gtag.js) - Google Analytics