Skip to content

Latest commit

 

History

History
70 lines (58 loc) · 18.9 KB

SYNTAX.md

File metadata and controls

70 lines (58 loc) · 18.9 KB

语法

类型

名称 类型 备注
AviatorScript bool,long(byte\short\int都被转为long),double(float被转为double),bigint(BigInteger,字面量超过long表示范围或以N结尾即为bigint),decimal(BigDecimal,字面量以M结尾),string(单引号或双引号,支持插值"#{name}"),正则(/^(.*)\.av$/),null(nil) 多种类型参与运算优先级:long->bigint->decimal->double,任何类型和double计算都会是double,开启Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL选项可以将浮点数都解析为decimal;string不能使用Java类型的实例方法,需要通过string内置函数操作如string.length(s)
MVEL BigInteger(以I结尾),BigDecimal(以B结尾),string(单引号或双引号),null(null或nil),其他同Java
OGNL BigInteger(以H或h结尾),BigDecimal(以B或b结尾),string(单引号或双引号),其他同Java
SpEl int/long/float/double/boolean,string(单引号或双引号),其他同Java
QLExpress string(单引号或双引号),其他同Java
JEXL BigInteger(以H或h结尾),BigDecimal(以B或b结尾),string(单引号或双引号,支持插值${name}),其他同Java
JUEL 同Java。表达式用${}包含

操作符

名称 操作符 备注
AviatorScript 幂运算(2**3),正则匹配("a.av" =~ /^(.*)\.av$/ 通过 AviatorEvaluatorInstance.aliasOperator(OperatorType, String)方法来设置别名,目前仅支持 AND和 OR操作。 通过 AviatorEvaluatorInstance#addOpFunction(OperatorType, AviatorFunction) 就可以自定义操作符的行为
MVEL foo == empty foo满足任何空要求返回true;"123" == 123 右值强转为左值类型返回true;user.?manager.name 安全访问属性; parentNames = (parent.name in users) 投影类似stream map的作用;
OGNL headline.parent.(ensureLoaded(), name)点处的对象将用作整个括号表达式中的当前对象;name in { null,"Untitled" } 判断是否为null或"Untitled" 对应的还有 not inusers.{name} 投影类似stream map的作用;userNames.{? #this instanceof String} 选择类似stream filter的作用;
SpEl '5.00' matches '^-?\\d+(\\.\\d{2})?$' 正则匹配;name?:'Unknown'name为空时为'Unknown'; user.?manager.name 安全访问属性;users.![name] 投影类似stream map的作用;map.?[value<27] 选择类似stream filter的作用;
QLExpress 支持自定义操作符,添加操作符号,可以设置优先级 void addOperator(String name, Operator op); void addOperator(String name, String aRefOpername, Operator op); 替换操作符处理 OperatorBase replaceOperator(String name, OperatorBase op); 添加操作符和关键字的别名,比如 if..then..else -> 如果。。那么。。否则。。 void addOperatorWithAlias(String keyWordName, String realKeyWordName, String errorInfo);
JEXL user.?manager.name 安全访问属性;x ?? 'unknown or null x' x 为 null 或 undefined 时 'unknown or null x'"a" =~ ["a","b","c","d","e",f"] in 或 匹配 时返回true;"a" !~ ["a","b","c","d","e",f"] not in 或 不匹配时返回true;"abcdef" =^ "abc" "abc"开头;a !^ "abc" 不以"abc"开头;"abcdef" =^ "def" "def"开头;a !^ "def" 不以"def"开头
JUEL ${!empty name} 判断name是否为空

控制语句

名称 控制语句 备注
AviatorScript else if 写法:elsiffor v in itr 类似 Javafor (v : itr);其他和Java类似 必须使用花括号
MVEL until循环和while逻辑相反;for (v : 3)遍历 1到3 ;其他和Java类似
OGNL 不支持
SpEl 不支持
QLExpress 不支持for (v: list)
JEXL 和Java类似 JexlScript支持 JexlExpression不支持,JEXL有些特性也是需要JexlScript才支持,但暂未找到详细说明
JUEL 不支持

集合

名称 集合 备注
AviatorScript tuple(定义固定数组, tuple(1, 2, 'hello')),seq(数组:seq.array(int, 1, 2),第一个参数是Java类型;列表:seq.list(1, 2);集合:seq.set(1, 2);映射:seq.map('a', 1)
MVEL 映射:["a" : 1] 列表:[1, 2] 数组:{1, 2}
OGNL 映射:#{"a" : 1} 列表:{1, 2} 数组:new int[]{1, 2}
SpEl 映射:{"a" : 1} 列表:{1, 2} 数组:new int[]{1, 2}
QLExpress 映射: NewMap("a" : 1) 列表:NewList(1, 2) 数组:[1, 2]
JEXL 映射:{"a" : 1} 列表:[1, 2...] 数组:[1, 2] 集合:{1, 2}
JUEL 无特殊语法

函数

名称 函数 备注
AviatorScript 函数:fn add(x, y) { return x + y;} lambda函数:lambda (x, y) -> x + y end 支持参数个数重载;支持不定参数fn join(sep, &agrgs) { ... };支持参数解包let list = seq.list(1, 2); add(*list);和js类似函数可以作为参数传递;通过AviatorEvaluator.addFunction(AviatorFunction)可以添加自定义函数;AviatorEvaluator.addInstanceFunctions(String, Class) 可以添加实例方法;AviatorEvaluator.addStaticFunctions(String, Class) 可以添加静态方法;最后一个不以分号结尾的表达式会作为函数(或脚本)的返回值
MVEL deffunction定义函数 def add(x, y) { return x + y;}lambda函数:def (x, y) { x + y } 最后一个表达式会作为函数(或脚本)的返回值
OGNL lambda #fact = :[#this<=1? 1 : #this*#fact(#this-1)], #fact(30H) @class@method(args) 调用静态方法;@class@field访问静态属性
SpEl 不支持
QLExpress 函数:function add(int a, int b){ return a + b; }; 不支持lambda 支持宏
JEXL 函数:var add = function(x, y) { x + y }lambda函数:var add = (x, y) -> { x + y } 最后一个表达式会作为函数(或脚本)的返回值
JUEL 不支持 不支持构造函数