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,则:

如 ("aaa name ttt" ~ "name") 为true
运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真($A == $B) 为 false
!=检查两个操作数的值是否相等,如果不相等则条件为真($A != $B) 为 true
>检查左操作数的值是否大于右操作数的值,如果是则条件为真($A > $B) 为 false
<检查左操作数的值是否小于右操作数的值,如果是则条件为真($A < $B) 为 true
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真($A >= $B) 为 false
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真($A <= $B) 为 true
~ !~Like,not like,用于使用正则表达式匹配, 运算符前面为字符串,后面为正则表达式。此处正则表达式字符串使用的是C#的规定

逻辑运算符

假设变量 $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 数据源 >>