首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自己动手写编译器:中间代码生成1

我们到了简单编译器开发的最后一个阶段,也就是生成中间代码。...我们的计划是这样,首先完成比较简单的代码的中间代码生成,然后不断提升目标代码的复杂度,然后生成更加复杂的中间代码。...本节我们要完成的如下目标代码的中间代码生成: { int a; int b; int c; a = 1; b = 2; c = a+b; } 我们要解析的代码跟前面描述的差不多,它只包含变量声明,变量赋值...Op节点,同时创建对应的子Arith节点,在生成中间代码时,先调用Arith的Gen函数生成代码字符串” a + b” 或是 “a - b”,然后创建一个临时寄存器变量t,最后生成中间代码: t = a...d), 于是expr1 对应a+b, expr2 对应c+d, 此时节点生成中间代码时,需要先让expr1和expr2生成代码 */ return NewArith(a.line

58810
您找到你想要的搜索结果了吗?
是的
没有找到

第七-八章 语法制导翻译和中间代码生成

许多编译程序采用的独立于机器的、复杂性界于源语言和机器语言之间语言源程序的一种内部表示:中间代码 用中间语言过渡的好处: 便于进行与机器无关的优化工作 使编译程序改变目标机容易,便于移植...emit(x ':=' y '+' z)将生成的三地址代码x:=y+z发送到输出文件。 newtemp 每调用一次,生成一个临时变量。 属性设置: 存储位置 place。...举例: if a<b or c<d and e<f then x:=y+z else x:=y-z 翻译过程: 首先按照自下而上的方式归约,每次归约句柄得到1-7步的中间代码...在产生中间代码的过程中,每个四元式的转移目标可能未知,将其链接起来。...3.4.3 翻译模式 使用上面这些翻译模式就可以让计算机自动进行中间代码(四元式)的生成,并且使用了拉链回填技术。注意,中间代码生成是在语法分析时进行的,所以所有翻译模式都是在归约时进行。

1.3K30

C语言随机数的生成

C语言随机数的生成 1.随机数的生成-rand()函数 注意: rand() 函数的使用需要调用 库文件 语法: int rand ( void ); 功能: ​ 函数返回一个在零到...生成范围: 0~RAND_MAX(32767) ​ 也可以对rand的取模操作,从而控制生成自己想要生成的范围 ​ eg: v1 = rand() % 100; // v1 生成的范围是...0 to 99 v2 = rand() % 100 + 1; // v2 生成的范围是 1 to 100 2.伪随机数 ​ 通过运行上述代码,我们发现确实生成了一个随机数,其值为41; 但是我们多次进行代码运行测试发现...这说明我们rand()函数 生成的 是一个 伪随机数!!!...伪随机并不是真实意义上的随机,而是具有一定规律的随机的随机 计算机会通过对应的随机数算法,随机数表中固定开始读取,且每次开始读取位置都相同,所以无论怎样生成的随机数都相同。

7310

c语言编写学生成绩管理系统(c语言生成绩管理系统删除)

② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结果。...学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能...: 学生成绩管理系统 1、 成绩录入 2、 成绩查询 3、 成绩统计 4、 退  出 (1)主菜单 (2)各菜单项功能 ① 成绩录入:输入学生的学号、姓名及三门课的成绩; ② 成绩查询:(至少一种查询方式...来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号...优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项

2.9K40

c语言rand函数生成随机数,详解C语言生成随机数rand函数的用法

说到rand函数,大家是不是会和EXCEL中的rand函数混淆,当小编第一次接触的时候也以为是EXCEL的函数,本文是爱站技术频道小编为大家带来的详解C语言生成随机数rand函数的用法,一起来看看吧!...函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。...而使用同种子相同的数调用 srand()会导致相同的随机数序列被生成。 srand((unsigned)time(NULL))则使用系统定时/计数器的值做为随机种子。...,则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。...其实绝对的随机数只是一种理想状态的随机数,计算机只能生成相对的随机数即伪随机数。计算机生 成的伪随机数既是随机的又是有规律的 —— 一部份遵守一定的规律,一部份则不遵守任何规律。

2.4K30

动手写编译器:手动构造语法树,驱动中间代码生成

在前面章节中我们给出了语法解析树对应节点的设计,这些节点能够针对其内容完成中间代码的输出,这一节我们继续完善必要节点的设计,然后手动构造语法树,并驱动语法树实现中间代码生成。...来生成中间代码,此外我们还需要再增加一个节点也就是常量节点,当编译器读取到类似“3;”,”5;”等常量时就会构造对应节点,在inter下创建文件constant.go,添加代码如下: package inter...{ return c.expr.NewLabel() } func (c *Constant) EmitLabel(l uint32) { c.expr.EmitLabel(l) }...{ return c } func (c *Constant) Reduce() ExprInterface { return c } func (c *Constant) Type...将他们相加的结果存放到临时寄存器变量t2,最后t1和t2通过”-“结合成一个算术表达式,与ID节点e一起构成一个Set节点,其中ID节点e对应Set节点的id字段,t1-t2对应Set节点的expr字段,于是在Set节点调用Gen生成代码是就会形成

32420

自己动手写编译器:实现else语句块的中间代码生成

前面几节我们完成了if语句以及判断条件成立时代码对应的中间代码生成,这次我们完成最后一笔,那就是针对else部分代码完成相应的中间代码生成。...本质上这一步比较简单,它会在原来if语句中间代码的基础上稍作修改即可,我们先看看这次我们要编译的代码内容: `{int a; int b; int c; int d; int...if条件判断中代码 e.stmt1.Gen(label1, end) //生成if成立后大括号里面代码的中间代码 e.Emit("goto L" + strconv.Itoa(int(end...))) //增加goto语句跳过else部分代码 e.EmitLabel(label2) e.stmt2.Gen(label2, end) //生成else里面代码对应中间代码 }...if成立时语句块的中间代码,最重要的是它在if语句块里面的代码完成生成后加入一条goto语句,这个goto语句的作用是越过else部分的代码。

38410

自己动手写编译器:while,for,do等循环语句的中间代码生成

我们的简易编译器完成了一大部分,但还有一些关键的语法结构没有处理,那就是for, while, do..while等循环语句对应的中间代码还没有生成,本节我们就针对这些语法结构进行相应的中间代码生成。...,它表明如果a >= 0 , b <= 4 这两个条件只要有一个不成立 ,那么就跳转到L5,注意到L5正好对应while循环体出去后的第一条语句,因此生成中间代码其逻辑符合我们在main.go中给定代码的意图...break语句对应的中间代码就需要记录它所在循环体外边接下来第一条语句的标号。...= c + 1; } */ source := `{int a; int b; int c; a = 3...= c + 1; } } while (a >= 0 && b <= 4); c = 2

1.1K10

C语言生成绩管理系统案例

最近可能是接近考试,有小伙伴微信私聊让找个学生成绩管理系统,今天发一下,比较简洁。...案例描述 案例要求模拟开发一个学生成绩管理系统,此系统具有以下功能: 添加学生信息,包括学号、姓名、语文成绩、数学成绩; 显示学生信息,将所有学生信息打印输出; 修改学生信息,可以根据姓名查找到学生,然后可以修改学生姓名...,函数调用在main.c文件中执行。...student.c文件中实现各个功能函数。...定义main.c文件在main.c文件中,定义保存学生信息的结构体数组,构建学生成绩管理系统主界面,使用while(1)循环控制是否退出系统,在while循环中使用switch语句判断用户所选择的功能,

2.8K98
领券