跳转到内容

表达式语法

极测的表达式引擎是一款专为通信调试测试场景自主研发的引擎。其核心优势在于采用了精简的专用语法,显著降低了学习门槛,使用户能够快速上手。同时,引擎具备高度灵活的可扩展性,支持轻松定制新语法,满足多样化的测试需求,为用户提供更高效、更便捷的解决方案。

通用语法

通用语法与Javascript(js)的语法类似。

基本类型

  • 支持number类型(整数 & 浮点数)
  • 字符串使用单 or 双引号表示
  • 十六进制整数以0x开头
  • 布尔值truefalse
  • 数组定义在[]之间

基本运算

  • 整数 & 浮点数的数值计算(加 +,减 -,乘 *,除 /,取余 %);
  • 整数支持位运算(按位与 &,按位或 |,按位异或 ^,按位非 ~,按位左移 <<,按位右移 >>,无符号右移 >>>);
  • 布尔值运算(相等 ==,不等 !=,大于 >,大于等于 >=,小于 <,小于等于 <=,与(同时支持 &&and),或(同时支持 ||or), 非 !);
  • 字符串运算(连接 +);
  • 支持使用圆括号来改变运算优先级;
  • 表达式结果支持js的truthyfalsy规则,例如计算结果为空字符串时,规则判定为false
  • 条件(三元)运算符:条件 ? 表达式1 : 表达式2,如果条件为true,则返回表达式1的结果,否则返回表达式2的结果。

通用函数

数学常量

e

欧拉数,即自然对数的底数 e,其值约为 2.718。

ln2

2 的自然对数,其值约为 0.693。

ln10

10 的自然对数,其值约为 2.302。

log2e

以 2 为底数,e 的对数,其值约为 1.442。

log10e

以 10 为底数,e 的对数,其值约为 0.434。

pi

圆周率,其值约为 3.141592653589793。

sqrt2

2 的平方根,其值约为 1.414。

数学函数

abs()

abs(x) 函数返回一个数字的绝对值。

  • 用法
abs(x)
  • 参数

    • x:一个数字。
  • 返回值

x 的绝对值。如果 x 是负数(包括 -0),则返回 -x。否则,返回 x

  • 示例
abs(-1); // 1
abs(-0); // 0
abs(0); // 0
abs(1); // 1

acos()

acos(x) 返回一个数的反余弦值(单位为弧度)。

  • 用法
acos(x)
  • 参数

    • x:一个数值。
  • 返回值

acos 方法以 -11 的一个数为参数,返回一个 0pi(弧度)的数值。如果传入的参数值超出了限定的范围,将返回 NaN

  • 示例
acos(-2); // NaN
acos(-1); // 3.141592653589793
acos(0); // 1.5707963267948966
acos(0.5); // 1.0471975511965979
acos(1); // 0
acos(2); // NaN

acosh()

acosh(x) 函数返回一个数的反双曲余弦值。

  • 用法
acosh(x)
  • 参数

    • x:一个数字。
  • 返回值

返回给定数的反双曲余弦值,如果该数小于 1 则返回 NaN

  • 示例
acosh(-1); // NaN
acosh(0); // NaN
acosh(0.5); // NaN
acosh(1); // 0
acosh(2); // 1.3169578969248166

asin()

asin(x) 方法返回一个数值的反正弦(单位为弧度)。

  • 用法
asin(x)
  • 参数

    • x:一个数值。
  • 返回值

asin 方法接受 -11 之间的数值作为参数,返回一个介于 -π/2π/2 之间的数值。如果接受的参数值超出范围,则返回 NaN

  • 示例
asin(-2); // NaN
asin(-1); // -1.5707963267948966
asin(0); // 0
asin(0.5); // 0.5235987755982989
asin(1); // 1.5707963267948966
asin(2); // NaN

asinh()

asinh(x) 返回一个数值的反双曲正弦值。

  • 用法
asinh(x)
  • 参数

    • x:一个数值。
  • 返回值

返回指定数值的反双曲正弦值。

  • 示例
asinh(-1); // -0.881373587019543
asinh(-0); // -0
asinh(0); // 0
asinh(1); // 0.881373587019543

atan()

atan(x) 返回一个数值的反正切值(单位为弧度)。

  • 用法
atan(x)
  • 参数

    • x:一个数值。
  • 返回值

atan 返回一个 -π/2π/2 弧度之间的数值。

  • 示例
atan(1); // 0.7853981633974483
atan(0); // 0

atanh()

atanh(x) 返回一个数值的反双曲正切值。

  • 用法
atanh(x)
  • 参数

    • x:一个数值。
  • 返回值

atanh 方法接受 -11 之间的数值作为参数,对于大于 1 或是小于-1 的值,函数返回 NaN。

  • 示例
atanh(-2); // NaN
atanh(-1); // -Infinity
atanh(0); // 0
atanh(0.5); // 0.5493061443340548
atanh(1); // Infinity
atanh(2); // NaN

cbrt()

cbrt(x) 返回一个数值的立方根。

  • 用法
cbrt(x)
  • 参数

    • x:一个数值。
  • 返回值

返回指定数值的立方根。

  • 示例
cbrt(-1); // -1
cbrt(-0); // -0
cbrt(0); // 0
cbrt(1); // 1
cbrt(2); // 1.2599210498948732

ceil()

ceil(x) 总是向上舍入,并返回大于等于给定数字的最小整数。

  • 用法
ceil(x)
  • 参数

    • x:一个数值。
  • 返回值

大于等于 x 的最小整数。

  • 示例
ceil(-7.004); // -7
ceil(-4); // -4
ceil(-0.95); // -0
ceil(-0); // -0
ceil(0); // 0
ceil(0.95); // 1
ceil(4); // 4
ceil(7.004); // 8

cos()

cos(x) 返回一个数值的余弦值。

  • 用法
cos(x)
  • 参数

    • x:一个以弧度为单位的数值。
  • 返回值

cos 方法返回一个 -11 之间的数值,表示角度(单位:弧度)的余弦值。

  • 示例
cos(0); // 1
cos(1); // 0.5403023058681398

cos(pi); // -1
cos(2 * pi); // 1

cosh()

cosh(x) 返回一个数值的双曲余弦值。

  • 用法
cosh(x)
  • 参数

    • x:一个数值。
  • 返回值

cosh 方法返回一个数值的双曲余弦值。

  • 示例
cosh(0); // 1
cosh(1); // 1.5430806348152437
cosh(-1); // 1.5430806348152437

exp()

exp(x) 函数返回 e^xx 表示参数,e 是欧拉常数(Euler's constant),自然对数的底数。

  • 用法
exp(x)
  • 参数

    • x:一个数值。
  • 返回值

exp 方法返回一个数值的指数函数值。

  • 示例
exp(-1); // 0.36787944117144233
exp(0); // 1
exp(1); // 2.718281828459045

floor()

floor(x) 函数返回小于等于 x 的最大整数。

  • 用法
floor(x)
  • 参数

    • x:一个数值。
  • 返回值

floor 方法返回小于等于 x 的最大整数。

  • 示例
floor(-45.95); // -46
floor(-45.05); // -46
floor(-0); // -0
floor(0); // 0
floor(4); //   4
floor(45.05); //  45
floor(45.95); //  45

log()

log(x) 函数返回 x 的自然对数(底为 e)。

  • 用法
log(x)
  • 参数

    • x:一个数值。
  • 返回值

log 方法返回 x 的自然对数(底为 e)。

  • 示例
log(-1); // NaN, out of range
log(0); // -Infinity
log(1); // 0
log(10); // 2.302585092994046

log2()

log2(x) 函数返回 x 的以 2 为底的对数。

  • 用法
log2(x)
  • 参数

    • x:一个数值。
  • 返回值

log2 方法返回 x 的以 2 为底的对数。

  • 示例
log2(2); // 1
log2(1024); // 10
log2(1); // 0
log2(0); // -Infinity
log2(-2); // NaN
log2("1024"); // 10

log10()

log10(x) 函数返回 x 的以 10 为底的对数。

  • 用法
log10(x)
  • 参数

    • x:一个数值。
  • 返回值

log10 方法返回 x 的以 10 为底的对数。

  • 示例
log10(10); // 1
log10(100); // 2
log10("100"); // 2
log10(1); // 0
log10(0); // -Infinity
log10(-2); // NaN

max()

max() 函数返回作为输入参数的最大数字,如果没有参数,则返回 -Infinity

  • 用法
max()
max(value0)
max(value0, value1)
max(value0, value1, /* … ,*/ valueN)
  • 参数

    • value1, value2, … , valueN:0 个或多个数字,将在其中选择,并返回最大的值。
  • 返回值

给定数值中最大的数。如果任一参数不能转换为数值,则返回 NaN。如果没有提供参数,返回 -Infinity

  • 示例
max(10, 20); //  20
max(-10, -20); // -10
max(-10, 20); //  20

min()

min() 函数返回作为输入参数的最小数字,如果没有参数,则返回 Infinity

  • 用法
min()
min(value0)
min(value0, value1)
min(value0, value1, /* … ,*/ valueN)
  • 参数

    • value1, value2, … , valueN:0 个或多个数字,将在其中选择,并返回最小的值。
  • 返回值

给定数值中最小的数。如果任一参数不能转换为数值,则返回 NaN。如果没有提供参数,返回 Infinity

  • 示例
min(10, -20); // -20

pow()

pow() 函数返回基数(base)的指数(exponent)次幂,即 base^exponent

  • 用法
pow(base, exponent)
  • 参数

    • base:基数。
    • exponent:指数。
  • 返回值

返回base^exponent

  • 示例
pow(2, 7); // 128

random()

random() 返回一个大于等于 0 且小于 1 的伪随机浮点数,并在该范围内近似均匀分布,然后你可以缩放到所需的范围。

  • 用法

random() | random

  • 参数

无。

  • 返回值

一个在 0(包括)到 1(不包括)之间的伪随机浮点数。

round()

round() 函数返回一个数值的四舍五入值。

  • 用法
round(x)
  • 参数

    • x:一个数值。
  • 返回值

返回 x 的四舍五入值。

  • 示例
round(20.49); //20
round(20.5); //21
round(-20.5); //-20
round(-20.51); //-21

sin()

sin() 函数返回一个数值的正弦值。

  • 用法
sin(x)
  • 参数

    • x:一个数值。
  • 返回值

x 的正弦值,介于 -11 之间(包含 -11)。

  • 示例
sin(-0); // -0
sin(0); // 0
sin(1); // 0.8414709848078965
sin(pi / 2); // 1

sinh()

sinh() 函数返回一个数字 (单位为角度) 的双曲正弦值。

  • 用法
sinh(x)
  • 参数

    • x:任意数字 (单位为度)。
  • 返回值

x 的双曲正弦值。

  • 示例
sinh(-0); // -0
sinh(0); // 0
sinh(1); // 1.1752011936438014

sqrt()

sqrt() 函数返回一个数字的平方根。

  • 用法
sqrt(x)
  • 参数

    • x:一个数值。
  • 返回值

x 的平方根。

  • 示例
sqrt(9); // 3
sqrt(2); // 1.414213562373095

sqrt(1);  // 1
sqrt(0);  // 0
sqrt(-1); // NaN
sqrt(-0); // -0

tan()

tan() 函数返回一个数值的正切值。

  • 用法
tan(x)
  • 参数

    • x:一个数值,表示一个角(单位:弧度)。
  • 返回值

x 的正切值。

  • 示例

将角度值 deg 转换为弧度值,然后计算正切值。

tan((deg * pi) / 180)

tanh()

tanh() 函数返回一个数值的双曲正切值。

  • 用法
tanh(x)
  • 参数

    • x:一个数值,表示一个角(单位:弧度)。
  • 返回值

x 的双曲正切值。

  • 示例
tanh(0); // 0
tanh(1); // 0.7615941559557649

trunc()

trunc() 方法会将数字的小数部分去掉,只保留整数部分。

  • 用法
trunc(x)
  • 参数

    • x:一个数值。
  • 返回值

x 的整数部分。

  • 示例
trunc(13.37); // 13
trunc(42.84); // 42
trunc(0.123); //  0
trunc(-0.123); // -0
trunc("-1.123"); // -1

时间函数

now()

now() 函数返回当前时间的时间戳,即自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数。

  • 用法

now() | now

  • 参数

无。

  • 返回值

当前时间的时间戳(单位:毫秒)。

elapsed()

elapsed() 函数返回当前时间与相关连接建立时间的差值(毫秒)。

  • 用法

elapsed() | elapsed

  • 参数

无。

  • 返回值

当前时间与相关连接建立时间之间的毫秒数差,如果不存在这样的连接,则返回 0

字符串

提供操作字符串的工具函数,包括startsWithendsWithincludes函数。

startsWith()

通过 字符串.startsWith(子字符串) 判断当前字符串是否以另外一个给定的子字符串开头,并根据判断结果返回 true 或 false。

endsWith()

通过 字符串.startsWith(子字符串) 判断一个字符串是否以指定字符串结尾,如果是则返回 true,否则返回 false。

includes()

字符串.includes(子字符串) 执行区分大小写的搜索,以确定是否可以在一个字符串中找到另一个字符串,并根据情况返回 true 或 false。

match()

字符串.match(字符串/正则语法) 检索字符串与正则表达式进行匹配的结果。

反之,正则语法.test(字符串) 可以到达同样的目的。

数组

startsWith()

通过 数组.startsWith(子数组) 判断当前数组是否以另外一个给定的子数组开头,并根据判断结果返回 true 或 false。

数据语法

数据语法提供了访问和操作数据的表达能力。在不同场景中,同一个关键字可能导向不同结果。数据语法支持以下场景:

  1. 通信数据生成:发送数据时,通过数据语法可以访问数据对象的数据内容,发送的上下文数据等。
  2. 数据包解析:分析数据包时,通过数据语法可以访问数据包的载荷,访问解析后的数据字段值等。
  • this:1. 发送数据时,访问当前编辑的内容对象; 2. 分析数据包时,访问当前数据包对象。
  • last:访问上一个数据包对象。
  • lastIn | last('in'):访问上一个方向为「接收」的数据包对象。
  • lastOut | last('out'):访问下一个方向为「发送」的数据包对象。
  • next:分析数据包时,访问下一个数据包对象。
  • nextIn | next('in'):分析数据包时,访问下一个方向为「接收」的数据包对象。
  • nextOut | next('out'):分析数据包时,访问下一个方向为「发送」的数据包对象。

结合以下「属性」关键字,构成形式如[数据/数据包].[属性]的表达式,可以访问指定「数据/数据包」的属性数据。

  • payload:分析数据包时,访问数据包对象的原始载荷,一般为字节流的数组。
  • data:1. 发送数据时,访问数据对象的数据内容; 2. 分析数据包时,访问解析后的载荷内容,例如将载荷解析为「文本」或「二进制文本」之后的字符串。
  • in:判断数据包的方向是否为接收,返回布尔值。
  • out:判断数据包的方向是否为发送,返回布尔值。
  • $任意字符串:1. 发送数据时,访问数据段对象的指定字段,$后跟随数据段定义的字段名称; 2. 分析数据包时,将载荷解析成指定数据段之后,访问指定字段数据,$后跟随数据段定义的字段名称。
  • asText:将载荷解析为文本字符串。默认采用 utf-8 解码,可通过 asText('gb18030') 来指定解码格式。
  • asSegment:将载荷解析为指定的数据段。需要通过 asSegment('数据段名称') 来指定数据段的名称。

协议语法

通过形如[协议名].[属性名]的格式获取数据的协议信息。

UDP | TCP | WebSocket

协议名: udp | tcpServer | tcpClient | wsServer | wsClient

  • src:获取源ip地址。
  • dst:获取目的ip地址。
  • srcport:获取源端口。
  • dstport:获取目的端口。

串口

协议名:serial

  • port:获取串口设备名。
  • parity:校验机制,参考取值为'none' | 'odd' | 'even'
  • flow:流控,参考取值为'none' | 'onoff' | 'rtscts'
  • stopBits:停止位,参考取值为1 | 1.5 | 2
  • dataBits:数据位,参考取值为5 | 6 | 7 | 8
  • baudRate:波特率,参考取值为'9600', '19200', '38400', '57600', '115200', '230400', '460800', '921600'

CAN

协议名:can

  • port:获取CAN总线设备名。
  • bitrate:比特率,参考取值为'125000', '250000', '500000', '800000', '1000000'
  • id:CAN帧的ID,标准帧ID长度为11比特,取值范围是0-2047。
  • rtr:是否为远程帧。

1553B

协议名(远程终端): rt1553

  • commandWord:RT消息的命令字。
  • statusWord:RT消息的状态字。
  • bufferIndex:RT消息的缓冲区索引。
  • rt:RT消息的远程终端地址。
  • sa:RT消息的子地址。
  • transmit:是否为发送方向(对该远程终端来说),参考取值为1 | 0
  • wordCount:有效数据字个数,取值范围0-31,0为32个有效数据字。
  • dataWords:数据字的数组。

协议名(总线控制器):bc1553

  • commandWord:BC消息的命令字。
  • statusWord:BC消息的状态字。
  • bufferIndex:BC消息的缓冲区索引。
  • messageIndex:BC消息索引。
  • rt:BC消息的远程终端地址。
  • sa:BC消息的子地址。
  • transmit:是否为发送方向(对远程终端来说),参考取值为1 | 0
  • wordCount:有效数据字个数,取值范围0-31,0为32个有效数据字。
  • dataWords:数据字的数组。

ZeroMQ

协议名:zmqpush | zmqpull | zmqreq | zmqrep | zmqpub | zmqsub

  • type:Endpoint的类型,本地绑定时为'bind',远程连接'connect'
  • address:绑定/连接的地址信息。
  • topic:接口为发布/订阅模型时,关联的主题名称。

用法示例

上述的语法功能提供了强大的表达能力,可以表示复杂的判断逻辑。具体示例参见数据动态生成数据自动解析数值动态验证