逻辑表达式解析器

今日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);
    }
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值