E, 这个算术节点指的是 ArithmaticNode.
由于之前已经测试了ArithmaticNode 全部可能的子节点项目, 因此这次要测试的非常简单, 只需要查看运算指令执行完毕后, 弹栈弹出的大小是不是期望的那么多. 所以, 直接上测试例子了
struct List* ins;
struct List* subIns;
struct ArithmaticNode* a;
struct IntegerNode* i = newIntegerNode(14);
a = newArithmaticNode((struct AbstractValueNode*)i);
subIns = i->createInstruction(i);
ins = a->createInstruction(a);
assert(1 + subIns->count(subIns) == ins->count(ins));
while (0 != subIns->count(subIns)) {
assertInsEqual_Del(ins->popElementAt(ins, 0),
subIns->popElementAt(subIns, 0));
}
assert(POP == ((struct AbstractInstruction*)
(ins->elementAt(ins, 0)))->code);
assert(INT_SIZE == ((struct IntParamInstruction*)
(ins->elementAt(ins, 0)))->param);
revert(ins->popElementAt(ins, 0));
ins->finalize(ins);
subIns->finalize(subIns);
a->delNode(a);
对于子节点的指令, 仍然是产生相同的节点指令再一一匹配. 下面就轮到声明语句了.
声明语句除了产生指令之外, 还会注册符号. 不过, 注册符号的具体细节在符号表模块已经完成了测试, 现在只是进行一点点简单的验证工作, 看看指定的变量是否被注册了. 比如这样
struct {
char* ident;
AcceptType type;
int nrDim;
int offsets[MAX_ARRAY_SIZE];
int size;
int base;
} data[NR_TEST_CASE] = {
{ "testee", INTEGER },
{ "tom", INTEGER },
{ "jerry", REAL },
{ "mANDg", REAL }
};
char* ident = "param";
char* ident1 = "param1";
struct DeclarationNode* dec;
struct List* ins;
initialSymTabManager();
dec = newDeclarationNode(INTEGER_TYPE);
dec->vars->enqueue(dec->vars, newVariableNode(ident));
dec->initVals->enqueue(dec->initVals, NULL);
dec->vars->enqueue(dec->vars, newVariableNode(ident1));
dec->initVals->enqueue(dec->initVals, NULL);
ins = dec->createInstruction(dec);
// 类型验证
assert(INTEGER == typeOf(dec->vars->peekAt(dec->vars, 0)));
assert(INTEGER == typeOf(dec->vars->peekAt(dec->vars, 1)));
assert(0 == ins->count(ins));
ins->finalize(ins);
dec->delNode(dec);
finalizeSymTabManager();
当然, 由于没有赋初值的动作, 因此没有任何指令产生. 对于有赋初始值的声明语句才需要测试其生成的指令, 而这些指令与一个算术节点非常类似
struct DeclarationNode* dec;
struct VariableNode* var1;
struct List* ins,* subIns1;
initialSymTabManager();
dec = newDeclarationNode(REAL_TYPE);
dec->vars->enqueue(dec->vars, newVariableNode(ident1));
dec->initVals->enqueue(dec->initVals, newVariableNode(ident));
var1 = newVariableNode(ident1);
ins = dec->createInstruction(dec);
assert(REAL == typeOf(var1));
subIns1 = var1->addressOf(var1);
assert(ins->count(ins) - 2 ==
subIns0->count(subIns0) + subIns1->count(subIns1));
while (0 != subIns1->count(subIns1)) {
assertInsEqual_Del(ins->popElementAt(ins, 0),
subIns1->popElementAt(subIns1, 0));
}
assert(REAL_ASSIGN == ((struct AbstractInstruction*)
(ins->elementAt(ins, 0)))->code);
revert(ins->popElementAt(ins, 0));
assert(POP == ((struct AbstractInstruction*)
(ins->elementAt(ins, 0)))->code);
assert(REAL_SIZE == ((struct IntParamInstruction*)
(ins->elementAt(ins, 0)))->param);
revert(ins->popElementAt(ins, 0));
finalizeSymTabManager();
这两类节点的指令生成测试大致就是这样了. 请 svn update 一下 Jerry 目录吧.
分享到:
相关推荐
### 动力节点-Java基础视频教程知识点概览 #### 一、Java基础知识体系构建 1. **Java语言概述** - Java的发展历程与特点 - Java的应用领域:Web应用开发、移动应用(Android)、大数据处理等 - Java与其他编程...
1. **基础语法**:包括变量声明(var, let, const)、数据类型(number, string, boolean, null, undefined, object, symbol)、操作符(算术、比较、逻辑)、流程控制(条件语句、循环语句)等。 2. **函数**:...
- **变量、数据类型与运算符**:讲解JavaScript中的基本语法,包括声明变量、使用不同数据类型以及常见的算术逻辑运算。 - **函数与对象**:深入理解函数的定义与调用过程,学会使用对象来组织复杂数据结构。 - **...
1. **基础语法**:包括变量声明(var、let、const)、数据类型(字符串、数字、布尔值、null、undefined、对象、数组、Symbol、BigInt)、运算符(算术、比较、逻辑、位操作、三元运算符)、流程控制(条件语句、...
根据提供的文件信息,我们可以整理出一系列与C#编程语言及计算机基础知识相关的知识点: ### C#基础知识及计算机原理 #### 题目解析 **Question1.** - **问题描述不清晰,无法直接给出知识点,但从题目编号判断...
1. **基础语法**:理解变量声明(var、let、const)、数据类型(字符串、数字、布尔、null、undefined、对象、数组、Symbol、BigInt)、操作符(算术、比较、逻辑、三元)、流程控制(条件语句、循环语句、函数、...
标准模块在Visual Basic等编程环境中,用于存放可被多个窗体或程序共享的通用过程,它不依附于任何特定的窗体,但并非只能包含过程,还可以包含变量和常量的声明。 窗体上的控件可以通过设置不同的属性来改变其行为...
* 软件测试时软件开发过程的哪个阶段的:软件测试是在软件开发的最后阶段进行的。 计组: * 冯诺依曼系统结构:冯诺依曼系统结构是一种计算机系统结构,包括输入、控制、算术逻辑单元、存储器等部分。 * 冯诺依曼...
1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制...
第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java...
”,语法分析器会创建一个树形结构,其中根节点可能是“声明”,而子节点包括“类型”(int)、“标识符”(x)和“赋值”表达式。这个过程通常由上下文无关文法(Context-Free Grammar,CFG)来描述,它定义了一种...
* 高级语言的特点:易于使用、跨平台、开发效率高 二、C语言基础知识 * C语言的特点:过程式、结构化、可移植 * C语言的基本数据类型:整型、字符型、浮点型 * C语言的运算符:算术运算符、比较运算符、逻辑运算符...
1. **基础语法**:JavaScript的基础包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔、null、undefined、对象、数组)、操作符(算术、比较、逻辑、赋值等)以及流程控制(条件语句、循环结构)。...
6. 树与二叉树:树是一种非线性数据结构,二叉树是每个节点最多有两个子节点的特殊树形结构,用于表示层次关系和实现搜索操作。 7. 查找技术:包括顺序查找、二分查找、哈希查找等,用于快速定位数据。 8. 排序技术...
Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...
- **测试与调试**:讨论单元测试、集成测试的重要性,以及如何使用浏览器开发者工具进行调试。 #### 结论 《Professional JavaScript™ for Web Developers》是一本全面覆盖JavaScript核心技术和最佳实践的书籍,...
4. **软件测试**:确保软件质量的过程,包括单元测试、集成测试和系统测试。 5. **程序调试**:识别和修复程序中的错误,确保程序正确运行。 四、数据库设计基础 1. **数据库系统的基本概念**:包括数据库、...
1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 ...
- 运算符:包括算术运算符(+、-、*、/)、赋值运算符(=)、比较运算符(>、<、>=、、==、===、!=)和逻辑运算符(&&、||)。 2. 条件语句和循环语句: - if语句:基于条件执行代码块。 - while循环:只要条件...
2. 测试与调试:介绍单元测试、集成测试工具,以及如何使用浏览器开发者工具进行调试。 3. 前端框架:简述React、Vue、Angular等主流前端框架的基本概念和应用场景。 4. 移动端开发:探讨如何使用JavaScript进行移动...