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