2.1.9 ACCENT中局部变量定义(Rule Prelude)
规则中使用的属性变量都不需定义.如果想在语义动作内声明其它变量即局部变量,则分下面两种情况:
1). 该变量只对某一分支可见
如 demo:
{int i=0;} alt_1
| alt_2 ;
2). 对规则内所有分支可见(但对其它规则不可见)
demo:
%prelude {int i=0;}
alt_1 |
alt_2
2.2 测试用例生成系统的总体结构
说明:
1. 系统读入用SOOL编写的源程序,这个程序存在一个文本文件上.
2. 作预处理.找到源程序中所有的WHILE语句,转化成三个IF语句,并填加循环标记.
3. 词法分析.使用工具FLEX,使源程序生成TOKEN序列.
4. 语义分析和生成语法树.根据文法表达和语义信息,建立SOOL语言的语法树,这样,读入程序后,可在语法树上识别和存储程序中的各个部分,所有的叶结点存储的即是程序源代码的TOKEN序列.
5. 类覆盖的路径查找处理.按照条件组合覆盖策略,类覆盖策略和路径覆盖策略,在SOOL语法树上静态查找程序可能执行到的路径.大体上细分为:
5.1 基本数据结构的建立与使用.基本数据结构是指五种表:类信息表,对象生存期表,变量信息表,函数信息表,输入变量表.
5.2 赋值,发消息语句处理.解决赋值,发消息语句对变量,函数以及对类的影响.
5.3 IF,WHILE语句处理.IF语句是产生执行分支的重要语句,根据IF语句的判断条件,寻找可能产生分支的判断.WHILE语句已经由预处理替换成带有循环标记的IF语句,要针对不同的情况分析其对判断条件的影响.
5.4 嵌套函数展开及处理.嵌套函数可出现在赋值语句,发消息语句以及IF语句的判断条件中;嵌套的函数可能是类中的函数,也可能是某个父类中的函数,要针对不同的情况,使用函数展开所需的函数展开栈进行处理.
5.5 路径二叉树的建立与使用.由IF语句产生的分支连在一起就组成了若干程序可能执行到的路径,用二叉树的方式把这些分支存下来,遍历二叉树就得到了所有的路径.
5.6 条件表达式的化简.在每一条路径上存在数个判断条件,经过代入计算,得到输入变量之间的条件表达式,化简至规范的形式.
6. 测试用例的生成.对每条路径上判断条件进行分类,对不同的类,按不同的策略生成测试用例.大体上细分为:
6.1 表达式梯度值的计算.对路径上条件判断表达式进行偏微分计算,结果为方向导数值,得到各表达式的梯度.
6.2 大于(等于)关系测试用例生成.对路径上条件判断表达式中为大于或大于等于关系的由梯度值生成测试用例.
6.3 等于关系测试用例生成.对路径上条件判断表达式中为等于关系的,按一元方程取相反数,二元方程用求根公式的方法生成测试用例.
6.4 用例回代变量链表求值.按一个条件判断表达式生成的用例,需要回代入后面的表达式中,检查是否满足.只有满足一条路上所有判断表达式的一组值,才是一条路上的测试用例.
6.5 回溯及遍历的控制.处理两种情况,一种是条路上到某一判断表达式不能满足的情况;另一种是一条路处理完毕,进行下一条路的处理,直至遍历.
7. 输出生成的测试用例结果.结果表示将以若干组输入值的形式给出,每一组输入值对应执行一条路径.
第三章 SOOL的语法树结构
3.1 SOOL的语法树
3.1.1抽象语法树与中间代码
测试用例生成系统面对的是一个SOOL文本源程序(经词法分析程序FLEX词法分析后生成TOKEN序列,但其结构与源程序相同),要对源程序进行分析必须将其转换成中间表示形式.抽象语法树(AGT)是用于代码生成的最一般的中间代码形式,主要用来表示语句中出现的表达式.
某些语言需要多遍扫描,以便检查静态语义,这是因为该语言允许使用在定义之前.为了实现方便,我们规定SOOL不可以使用在前定义在后.对于使用在前定义在后的情形,第一遍扫描可以进行语法和词法分析,并建立抽象语法树和符号表;第二遍扫描可进行属性的计算和静态语义检查;再通过简单的树遍历,可进行独立于机器的优化,它是树到树的转换;最后,通过树遍历可直接产生目标代码,或产生更适合实际代码生成器或优化器的不同表示.
抽象语法树可使用于语义分析,中间代码优化和代码生成等方面.实际上,它的应用可以更为广泛.很多Ada实现都基于实际的抽象语法表示,称之为Diana.它的目的不仅仅在于编译器描述,而且还在于描述分别编译单位(包和过程)程序库的表示和作为其它的工具间公共界面.我们称Diana是抽象语法表示,而不称之为抽象语法树表示,原因是它是一个DAG而不是树.DAG实际上是从AGT发展而来的,其主要优点是能够描述共享问题.④
假设有e = a * b + c * d 则其抽象语法树如下图:
三元式,四元式和抽象语法树之间存在着简单的互换性,其中抽象语法树的特点是没有固定计算顺序,而三元式和四元式则不同,故抽象语法树更具有一般性.
3.1.2 SOOL的语法树结构
SOOL语法树的主要部分结点结构:
1. SOOL程序由三部分组成:预包含部分,类部分和主函数部分.程序结点结构如下:
其中标识为整型;其它三部分为指针,指向程序中各个部分.
2. 主函数部分结点结构如下:
其中标识为整型;返回值类型为整型或布尔型;语句部分为指针,它指向主函数语句块.
3. 预包含部分结点结构如下:
其中标识为整型;头文件名为字符型.
4. 类部分结点结构如下:
其中标识为整型;本类名为字符型;父类名为字符型,前面有访问控制符,是直接父类;类体部分指针,指向类中语句块.
5. 主函数语句块结构如下:
其中标识为整型;函数声明部分为指针,指向函数声明语句;语句块为指针,指向主函数语句.主函数语句分为赋值语句,IF语句,WHILE语句,输入输出语句,类函数调用语句以及空语句.
6. 类中语句块结点结构如下:
其中标识为整型;访问控制符为指针,指向PUBLIC,PROTECTED或PRIVATE;类函数声明部分为指针,指向类中的函数声明语句;类语句块为指针,指向类中语句.类中语句分为赋值语句,IF语句,WHILE语句,类函数调用语句以及空语句.
7. 函数声明部分结点结构如下:
其中标识为整型;类型为指针,指向类型结构;变量为指针,指向变量结构.
8. 赋值语句结点结构如下:
其中标识为整型;变量为指针,指向变量结构;表达式为指针,指向表达式结构.
9. IF语句结点结构如下:
其中标识为整型;表达式为指针,指向表达式结构;语句块1为指针,指向语句块结构,这是当表达式为真时执行的语句块;语句块2为指针,指向语句块结构,这是当表达式为假时执行的诗句块.
10. WHILE语句结点结构如下:
其中标识为整型:表达式为指针,指向表达式结构;语句块为指针,指向语句块结构.在本文中,由于进行了预处理,WHILE语句全都被替换成带有循环标志的IF语句,这一部分实际没有用到.
11. 类函数发消息语句结点结构如下:
其中标识为整型;类名为字符串型;函数名为字符串型;实参表为指针,指向函数发消息实参表结构.
12. 输入语句结点结构如下:
其中标识为整型;输入变量表为指针,指向输入变量表结构.
13. 输出语句结点结构如下:
其中标识为整型;输出变量表为指针,指向输出变量表结构.
14. 表达式结点是一个联合体,其结构如下:
其中标识为整型;简单表达式为指针,指向简单表达式结构;关系表达式为指针,指向关系表达式结构;布尔表达式为指针,指向布尔表达式结构.
15. 关系表达式结点结构如下:
其中标识为整型;表达式1为指针,指向表达式结构;关系操作符为指针,指向关系操作符结构;表达式2为指针,指向表达式结构.
16. 布尔表达式结点结构如下:
其中标识为整型;表达式1为指针,指向表达式结构;布尔操作符为指针,指向布尔操作符结构;表达式2为指针,指向表达式结构.
17. 简单表达式结构如下:
其中标识为整型;正负号为指针,指向正负号结构;项1为指针,指向乘除表达式结构;加减操作符为指针,指向加减操作符结构;项2为指针,指向乘除表达式结构.
文章来源于领测软件测试网 https://www.ltesting.net/