spring中expression框架设计与实现

1、接口设计

主要由ExpressionParser,ParserContext,Expression,EvaluationContex以及EvaluationContex相关组件(OperatorOverloader,TypeComparator,PropertyAccessor,ConstructorResolver,MethodResolver,BeanResolver, TypeLocator,TypeConverter)以及AST结点SpelNode组成

 2、词法分析

词法分析是通过Tokenizer类来处理的,使用枚举TokenKind来表示类型,Token中的startPos表示token的起始字符,endPos表示结束位置,左闭右开的

TokenKind枚举类型包含

类型字符串值
LITERAL_INT""
LITERAL_LONG""
LITERAL_HEXINT""
LITERAL_HEXLONG""
LITERAL_STRING""
LITERAL_REAL""
LITERAL_REAL_FLOAT""
LPAREN"("
RPAREN")"
COMMA","
IDENTIFIER""
COLON":"
HASH"#"
RSQUARE"]"
LSQUARE"["
LCURLY"{"
RCURLY"}"
DOT"."
PLUS"+"
STAR"*"
MINUS"-"
SELECT_FIRST"^["
SELECT_LAST"$["
QMARK"?"
PROJECT"!["
DIV"/"
GE">="
GT">"
LE"<="
LT"<"
EQ"=="
NE"!="
MOD"%"
NOT"!"
ASSIGN"="
INSTANCEOF"instanceof"
MATCHES"matches"
BETWEEN"between"
SELECT"?["
POWER"^"
ELVIS"?:"
SAFE_NAVI"?."
BEAN_REF"@"
FACTORY_BEAN_REF"&"
SYMBOLIC_OR"||"
SYMBOLIC_AND"&&"
INC"++"
DEC"--"

标识符:由字母、数字,下划线、美元符号组成,其中首字符为字母或者下划线或者美元。在判断标识符时,有一种特殊情况需要考虑,由DIV,EQ,GE,GT,LE,LT, MOD, NE,NOT组成时当作对应token的字符表示,不能当作标识符。

3、语法分析

是通过InternalSpelExpressionParser的eatExpression来实现的

expression : logicalOrExpression

                    ( (= logicOrExpression)

                       | (? expression : expression)

                       | (?:expression)

                    )

logicOrExpression : logicAndExpression (or logicAndExpression)

logicAndExpression : relationalExpression (and relationalExpression)

relationalExpression: sumExpression (relationalOperator sumExpression)

sumExpression : productExpression ( (+ | -) productExpression)

productExpression : powerExpr ((* | / | %) powerExpr)

powerExpr : unaryExpression (^ unaryExpression)? (++ | --)

unaryExpression : (+ | - | ! | ++| --) unaryExpression | primaryExpression

primaryExpression : startNode (node)

startNode : literal | parenExpr | type | constructor | methodOrProperty | functionOrVar | beanRef | factoryBeanRef | projection | selection | firstSelection | lastSelection | indexer | inlineList | inlineMap

 

 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值