大家好,欢迎来到IT知识分享网。
今日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:变量提供者,方便集成使用。
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);
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22610.html