FWScript 表达式
表达式指的是由变量或常量使用运算符组成的一个计算公式,最终通过计算后,可以获得一个结果,该结果或者是一个条件值(亦即布尔值),或者是其它数值类型。通常将结果为布尔值的表达式称为条件表达式。
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。
FWScript仅支持比较简单的表达式,表达式中只能出现简单的函数调用。
FwScript中的某些运算符依据数值类型具有不同的含义。
支持的运算符如下:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 其他运算符
- 字符串运算
- 简单字符串表达式
算术运算符
假设变量 $A 的值为 10,变量 $B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | $A + $B 为 30 |
- | 从第一个操作数中减去第二个操作数 | $A - $B 为 -10 |
* | 把两个操作数相乘 | $A * $B 为 200 |
/ | 分子除以分母 | $B / $A 为 2 |
% | 取模 | $B % $A 为 0 |
| | 位运算,取或 | %0x0F | %0xF0 为 0xFF |
& | 位预算,取与 | %0x0F & %0xF0 为 0x00 |
- Int, Float支持+、-、*、/
- Bool仅支持+、-,+等同“或”,-等同“与”
- String仅支持+
位运算示例: $a = %0xAF $b = %0xFA $c = $a & $b show $c.*6 // 结果为 0xaa $a = %0xA0 $b = %0x0A $c = $a | $b show $c.*6 // 结果为 0xaa
关系运算符
假设变量 $A 的值为 10,变量 $B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真 | ($A == $B) 为 false |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真 | ($A != $B) 为 true |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真 | ($A > $B) 为 false |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真 | ($A < $B) 为 true |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真 | ($A >= $B) 为 false |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真 | ($A <= $B) 为 true |
~ !~ | Like,not like,用于使用正则表达式匹配, 运算符前面为字符串,后面为正则表达式。此处正则表达式字符串使用的是C#的规定 | 如 ("aaa name ttt" ~ "name") 为true |
逻辑运算符
假设变量 $A 为布尔值 true,变量 $B 为布尔值 false,则:
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑“与”运算符。如果两个操作数都非零,则条件为真 | ($A && $B) 为 false |
|| | 称为逻辑“或”运算符。如果两个操作数中有任意一个非零,则条件为真 | ($A || $B) 为 true |
! | 称为逻辑“非”运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假 | !$A 为 false,!$B 为 true |
注意:目前BizRunner的实现不支持运算符隐含的逻辑,如针对 A || B,一般的编译实现中,如果A已经为True,则不会去执行B的运算。
例如:$a = CheckTheFirst() || CheckTheSecond(), 一般语言的实现中,会先执行CheckTheFirst()调用对应的函数,当这个调用返回的结果为True的时候,则不会去调用CheckTheSecond()。在BizRunner的实现中,将会先调用这两个函数,然后再计算。
其他运算符
假设变量 $A 的值为 10,变量 $B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
= | 赋值运算符,把右边操作数的值赋给左边操作数 | $C = $A + $B,$C 为 30 |
() | 圆括号,用于调节运算时的优先级 | $A * ($A + $B) 为 300 |
. | 属性值下标运算符,支持控件元素与数据源的下标,控件元素的下标为属性名称或其别名Alias;数据源的下标为其列的名字或序号 | $.name(控件的name属性) $var.name(变量var的name列) |
.* | 特殊下标运算 .*L 集合长度;.*X,*Y 元素坐标 .*I,*F,*B 字符串转整数、浮点数及布尔值 | $Element.*X,*Y 为控件所在左上位置的X坐标,Y坐标。 $Set.*L 为集合型变量值的长度 |
[dd-dd] | 集合类型变量的区间下标运算,取出集合中的具体元素或其子集 |
字符串运算与字符
使用以下特殊的字符串运算,解决了字符类型的问题。(借用符号||对于整数进行特殊的处理)
代码 | 描述 | 实例 |
---|---|---|
string + $value | 依据$value的类型作为字符串拼在一起,每个变量类型都可以依据约定转换成字符串 | "hello"+"world" 得到 "helloworld" "hello"+123 得到 "hello123" |
$value + string | 同上 | 123+"hello" 得到 "123hello" |
string || $int | 将$int的值转化成一个字符,然后拼在一起,注意此处$int当作一个字符的Unicode码值,而不是转换一个整数 | "hello"||97 得到 "helloa" "hello"||%a 得到 "helloa" |
$int || string | 同上 | 97||"hello" 得到 "ahello" %a||"hello" 得到 "ahello" |
string * $int | 将string 重复 $int 次,形成一个新的字符串 | "hello"*3 得到 "hellohellohello" |
$int || $int | 将两个整数值都当作字符整数拼在一起成为字符串,如果后面那个整数值为0,则忽略 | 97||98 得到 ab 97||0 得到 a |
运算的优先级
FWScript中对运算的优先级处理与一般语言的处理大致一样,但细节方面做了简单化处理,如将逻辑运算的优先级进行了等同处理(很多语言实现中,&&的优先级高于||)。 FWScript的运算优先级定义为:(从高到低排列) 1. 括号 () 2. 逻辑取非或二进制取反(依据后面表达式结果的类型而定) ! 3. 乘除与取模 * / % 4. 加减 + - 5. 位运算 | & 比较运算符 == != > >= < <= ~(like) !~(not like) 6. 逻辑运算 && || 7. 赋值运算 =
简单字符串表达式SSExpr
很多情况下,一个指令后面需要指定一个文件名,而在实际场景下,这个文件名有可能固定的,也有可能是来自于一个变量。如果使用正常的表达式,会增加BizRunner实现的复杂度。因此特别设计了一个“简单字符串表达式”的概念。
简单字符串表达式 Simple String Expression,缩写为SSExpr,由下述内容组成:
直接跟随着一串字符(没有引号或双引号)
字符串 'xxxx' 或 "xxxxx"
变量 $var (数字变量$0-$9; 或者标准变量如$list)
@变量 @12,或者直接使用@
空,在某些场景下,意味着使用了@,如果@在前面没有赋值,则为未指定
举例: record c:\tmp\a.wav // 意味着录音到固定的文件中。 record $file // 意味着录音到变量$file指定的文件中。 TakePhoto c:\tmp\a.jpg // 意味着将照片存放到固定的文件中 TakePhoto @12 // 意味着将照片存放到12号消息指定的文件中
<< FWScript 常量 | FWScript 数据源 >> |