Menu

QExp / Blog: Recent posts

QExp表达式解释器语法说明

1、语法要素
本部分描述的语法要素为QExp默认实现规则,子类可以重载TQExprParser的InternalParse
函数来实现不同的语法解析。
1.1、标志符
QExp的变量或函数名可以是_、英文字母,中文,也可以包含数字,但数字不能打头。标志
符的长度没有限制,理论上不超过1GB。
1.2、变量
脚本中的变量,如果没有特殊定义,均位于Locals分组下。程序定义的不受脚本解析限制
的变量或函数位于根分组下。
在脚本中可以直接为Result变量赋值,对Result变量的赋值将会做为执行结果。如果不设
置Result变量的值,则最后一句代码的计算结果被当作结果值。
一般变量的值,除非遇到赋值语句,否则其值不会改变。但对于一些特殊的变量,如果在
每次访问其值时都有可能改变,则应设置其Mutable属性为True。
 QExp表达式变量均为弱类型,即其类型取决于值的类型。
1.3、函数
系统中的函数分类两类,一类是由脚本直接编写的函数,另一类是由程序实现的固定函数。
通过脚本直接编写的函数必需在使用之前定义,否则会发生解析错误。
通过程序实现的固定函数必需注册到TQExprParser对象,并且不能注册到Locals分组下,
以避免在解析代码时被清除。
函数调用时,如果没有参数,也必需包括左右括号,如:Now()。
1.3.1、函数声明
脚本定义函数时,必需以关键字function开始,后跟函数名和参数声明,格式如下:
function 函数名(参数列表)
{
}
其中,参数列表之间以“,”分隔,如果参数数目不固定,可以用"..."来代表可变参数部分。
而在代码中,使用函数Params函数来获取附加参数的值,总参数个数可以通过ParamCount函
数获取(注意这两个函数作用域仅限于函数内部)。
可以在函数中进一步定义子函数,如下面的代码是合法的:
function F1(x,y)
{
function F2(a,b)
{
Result=a*b;
}
Result=F2(2,x)+F2(3,y);
}
子函数只要在其被调用前定义即可,并不要求一定在函数开始。
当一个函数直接赋给一个变量时,函数的名称可以省略,如果函数没有任何参数时,函数
声明关键字function也可以省略。以下语法在QExp中是合法的:
a=function(x,y)
{
Result=x+y;
};
a(1,2);
上面的代码能够正确的解析,其结果是3。
a={
x=1;
y=2;
Result=x+y;
};
同样是合法的,其结果同样为3.
1.3.2、可变参数的函数
函数支持不定数目的参数,用户自定义函数声明时,不定参数部分使用"..."用来代替后
面的不定参数,如下面的声明:
function DoSum(v1,...)
其中,v1被当做必需传递的参数,后面的...代表可以后跟任意个不定数目的参数。
脚本中要获取参数的个数,可以使用ParamCount()函数,要访问每个参数的值,可以使用
Params(AParamIndex)函数,注意上述两个函数均包含固定参数,并不只适应于变参函数。
[注意]{}中间的代码在QExp中也被当做一个匿名函数来执行,因此,如果在{}中调用
ParamCount将始终返回0,而Params将抛出索引越界错误。
1.4、作用域
函数中定义的变量或子函数的作用域仅限函数自己,超出该作用域函数即告无效。系统注
册到TQExprParser对象的变量或函数为全局变量,始终有效。
1.5、运算符及其优先级
QExp中的运算符有不同的优先级,高优先级的运算符会优先计算后再与低优先级的运算符
相结合。要先运算低优先级的运算符,请使用()将要运算的表达式内容进行优先级提升。

运算符 优先级 备注

语句分隔符
,       0     逗号运算符,用于分隔参数
;       0     分号用来标记语句结束

赋值运算符
=       1     赋值运算符

自运算符,计算结果被赋值给自己,如a+=2相当于a=a+2+=      1     自加运算符
-=      1     自减运算符 
*=      1     自乘运算符
/=      1     自除运算符
\=      1     自除取整运算符,将除法运算的结果再取整后赋给自己
%=      1     自余运算符
&=      1     自位与运算符
|=      1     自位或运算符
^=      1     自位非运算符
<<=     1     自左移位运算符
>>=     1     自右移位运算符
++      9     自增运算符,等价于+=1
--      9     自减运算符,等价于-=1

逻辑运算符
&&      2     逻辑与(并且)
||      2     逻辑或(或者)
!       2     逻辑非

位运算符
&       3     位与
|       3     位或
^       3     异或
~       3     位非

比较操作符
==      4     等于
!=      4     不等于
<>      4     不等于(与!=等价)
<       4     小于
<=      4     小于等于
>       4     大于
>=      4     大于等于

移位操作符
<<      5     左移位运算符
>>      5     右移位运算符

算术运算符
+       6     -       6     *       7     /       7     \       7     整除
%       7     求余
**      8     幂运算符
++      9     自增运算符
--      9     自减运算符

1.6、流程控制
QExp的脚本的流程控制使用五个辅助函数实现:
IfThen 检查第一个参数条件是否符合,如果符合,执行参数2的代码,如果不符合,执行
参数3代码。
Goto 跳转到指定的代码行,参数为代码行号(注意脚本函数定义部分不计算代码行)
Exit 中止代码执行退出
While 循环直到条件不满足
Break 中断循环中后续语句的执行并跳出循环(目前仅限while),Goto不受限制... read more

Posted by swish 2013-07-23