今日38,百竿子打不找的干系,居然有点郁闷,k!
无聊,写点东西以备急需之用,出发点为jsp权限标签使用。
逻辑表达式解析器
Author: zfzheng 2008-03-08
作用:
用于内嵌逻辑表达式,如
JSP标签:
1)分页信息
< x:page footable ="pageCount>0" > ... </ x:page >
2)权限值大于普通用户,且不是管理员。
< x:auth role ="user>normal&&user!=admin" > ... </ x:auth >
操作数及操作类型:
1)数值(整型、浮点型): == > >= < <= < > /!=
2)boolean: && || !
java对象:Express、boolean、String、int/float
逻辑表达式文法:
expx -> exp {op expx}
exp -> tag | "(" expx ")" | op expx
op -> == | > | >= | < | <= | < > | != | && | || | !
tag -> boolean | number | {text}+
boolean -> true | false
number -> [0-9]+(.[0-9]+)?
text -> charset
expx与exp使用同一java对象,文法抽出来的原因:1)支持连续表达式 2)避免左递归
【代码注解】
分析器:Lexer、ExpressParser
语法树对象:Express、Operation
执行辅助类:EvalCommand、ValueProvider
1.ExpressParser:按文法描述编写
2.Express:
二目操作,单目(!)操作左操作数为空。
(expx)表达式根节点,只有左操作树,op、右操作数为空。
求值遍历顺序: 采用LTR(左中右),注意左节点的值,先递归再参与运算。遇到聚合节点,即刮号表达式根节点,则断开当前递归优先求值。
提供eval求指方法。
3.Operation:操作符对象,使用单子模式,操作数延迟到方法参数,节约内存。
4.EvalCommand:求值命令,Express#eval中创建,Operation#eval中执行。
该类作用:延迟求值,避免不必要的计算,如true||exp,则exp不求值。
5.ValueProvider:变量提供者,方便集成使用。
Author: zfzheng 2008-03-08
作用:
用于内嵌逻辑表达式,如
JSP标签:
1)分页信息
< x:page footable ="pageCount>0" > ... </ x:page >
2)权限值大于普通用户,且不是管理员。
< x:auth role ="user>normal&&user!=admin" > ... </ x:auth >
操作数及操作类型:
1)数值(整型、浮点型): == > >= < <= < > /!=
2)boolean: && || !
java对象:Express、boolean、String、int/float
逻辑表达式文法:
expx -> exp {op expx}
exp -> tag | "(" expx ")" | op expx
op -> == | > | >= | < | <= | < > | != | && | || | !
tag -> boolean | number | {text}+
boolean -> true | false
number -> [0-9]+(.[0-9]+)?
text -> charset
expx与exp使用同一java对象,文法抽出来的原因:1)支持连续表达式 2)避免左递归
【代码注解】
分析器:Lexer、ExpressParser
语法树对象:Express、Operation
执行辅助类:EvalCommand、ValueProvider
1.ExpressParser:按文法描述编写
2.Express:
二目操作,单目(!)操作左操作数为空。
(expx)表达式根节点,只有左操作树,op、右操作数为空。
求值遍历顺序: 采用LTR(左中右),注意左节点的值,先递归再参与运算。遇到聚合节点,即刮号表达式根节点,则断开当前递归优先求值。
提供eval求指方法。
3.Operation:操作符对象,使用单子模式,操作数延迟到方法参数,节约内存。
4.EvalCommand:求值命令,Express#eval中创建,Operation#eval中执行。
该类作用:延迟求值,避免不必要的计算,如true||exp,则exp不求值。
5.ValueProvider:变量提供者,方便集成使用。
public
void
testLogic()
throws
Exception {
ExpressParser ep = new ExpressParser();
String s = " user>normal&&user!=admin " ;
Express e = ep.parse(s);
StaticValueProvider vp = new StaticValueProvider();
vp.setValue( " admin " , 10 );
vp.setValue( " normal " , 1 );
vp.setValue( " user " , 5 );
Object ret = e.eval(vp);
assertEquals( true , ret);
vp.setValue( " user " , 10 );
ret = e.eval(vp);
assertEquals( false , ret);
}
ExpressParser ep = new ExpressParser();
String s = " user>normal&&user!=admin " ;
Express e = ep.parse(s);
StaticValueProvider vp = new StaticValueProvider();
vp.setValue( " admin " , 10 );
vp.setValue( " normal " , 1 );
vp.setValue( " user " , 5 );
Object ret = e.eval(vp);
assertEquals( true , ret);
vp.setValue( " user " , 10 );
ret = e.eval(vp);
assertEquals( false , ret);
}