package org.nutz.el; import java.util.Queue; import org.nutz.el.arithmetic.ShuntingYard; import org.nutz.el.arithmetic.RPN; import org.nutz.lang.util.Context; public class El { private RPN rc = null; private CharSequence elstr = ""; public El(){} /** * 预编译 */ public El(CharSequence cs){ elstr = cs; ShuntingYard sy = new ShuntingYard(); Queue<Object> rpn = sy.parseToRPN(cs.toString()); rc = new RPN(rpn); } /** * 解析预编译后的EL表达式 */ public Object eval(Context context) { if(rc == null){ throw new ElException("没有进行预编译!"); } return rc.calculate(context); } /** * 对参数代表的表达式进行运算 */ public static Object eval(String val) { //逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法) return eval(null, val); } public static Object eval(Context context, String val) { ShuntingYard sy = new ShuntingYard(); RPN rc = new RPN(); Queue<Object> rpn = sy.parseToRPN(val); return rc.calculate(context, rpn); } public String toString() { return elstr.toString(); } /** * 说明: * 1. 操作符优先级参考<Java运算符优先级参考图表>, 但不完全遵守,比如"()" * 2. 使用Queue 的原因是,调用peek()方法不会读取串中的数据. * 因为我希望达到的效果是,我只读取我需要的,我不需要的数据我不读出来. */ //@ JKTODO 删除原来的EL包,并修改当前为EL //@ JKTODO 自己实现一个QUEUE接口, 主要是实现队列,头部检测,头部第几个元素检测 }