Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ejacky/163-compiler

Repository files navigation

163-compiler

LAB

第一单元作业 编译器介绍

题目:(本题目是一个动手实践类题目,需要具备C语言和数据结构基础。)
在课程中,我们讨论一个小型的从表达式语言Sum到栈计算机Stack的编译器,
在附件中,你能找到对该编译器的一个C语言实现,但这个实现是不完整的,请你
把缺少的代码补充完整(不超过10行代码)。
加分题:实现常量折叠优化。

第二单元作业 词法分析(Part I):词法分析器

在这部分中,你将使用图转移算法手工实现一个小型的词法分析器。
* 分析器的输入:存储在文本文件中的字符序列,字符取自ASCII字符集。文件中可能包括下面几种记号:关键字if、符合C语言标准的标识符、无符号整型数字、空格符、回车符\n。
* 分析器的输出:打印出所识别的记号的种类、及记号开始行号、开始列号信息。
注意:1. 忽略空格及回车符;2. 对于标识符和数字,要输出符号的具体词法单元(见下面的示例)。
【示例】对于下面的文本文件:
ifx if iif if 234
iff if
你的输出应该是(注意,因为文本显示的原因,列号信息可能不一定准确):
ID(ifx) (1, 1)
IF (1, 4)
ID(iif) (1, 8)
IF (1, 13)
NUM(234) (1, 16)
ID(iff) (2, 1)
IF (2, 8)

第三单元作业 词法分析(Part II)

给定如下的正则表达式 (a|b)((c|d)*),请完成如下练习:
(1)使用Thompson算法,将该正则表达式转换成非确定状态有限自动机(NFA);
(2)使用子集构造算法,将该上述的非确定有限状态自动机(NFA)转换成确定状态有限自动机(DFA);
(3)使用Hopcroft算法,对该DFA最小化

第四单元作业 语法分析(Part I):算术表达式的语法分析器

在这个题目中,要求你完成一个针对算术表达式的语法分析器。该算术表达式的上下文无关文法是:
E -> E + T
 | E - T
 | T
T -> T * F
 | T / F
 | F
F -> num
 | (E)
请下载我们提供的C代码框架,并把其中缺少的部分补充完整。
代码下载地址:
http://staff.ustc.edu.cn/~bjhua/mooc/exp.zip

第五单元作业 语法分析(Part II):台式计算器的设计与实现

在这个题目中,你将实现一个简单的台式计算器。这个台式计算器的功能像在最后一个讲义中演示的例子一样:即用户可以在控制台上交互输入算术表达式,你的程序判断该表达式是否合法,不合法的话报错并退出运行。
你的程序涉及表达式的部分要支持如下的表达式:
E -> n
 | E + E
 | E - E
 | E * E
 | E / E
 | (E)
其中n是任意的非负整数(注意:在我们演示的例子中,n只是单个字符的整数,所以这个地方你需要做些扩展,这些扩展同时需要涉及修改词法分析yylex函数)。
如果在Linux系统上,那么bison应该是默认安装可用的;如果你需要在Windows上完成,你可以下载Windows平台上的bison:
http://staff.ustc.edu.cn/~bjhua/mooc/bison.exe
注意:1。安装目录不能包含空格汉字等特殊字符;2。安装完成后把安装目录加到环境变量中。

第六单元作业 语法制导翻译与抽象语法树:抽象语法树

【抽象语法树】
在这个题目中,你将完整的实现抽象语法树(包括数据结构的定义、语法树的生成等)。首先,请下载我们提供的代码包:
http://staff.ustc.edu.cn/~bjhua/mooc/ast.zip 
代码的运行方式是:
首先生成语法分析器:
 $ bison exp.y
然后生成编译器:
 $ gcc main.c exp.tab.c ast.c
最后使用编译器编译某个源文件:
 $ a.exe <test.txt
在提供的代码里,我们已经提供了抽象语法树的定义、若干操作、及由bison生成语法树的代码框架。你的任务是:
进一步完善该代码框架,使其能够分析减法、除法和括号表达式;(你需要修改语法树的定义,修改bison源文件及其它代码)
重新研究第一次作业中的从Sum编译到Stack的小型编译器代码,把他移植到目前的代码框架中,这样你的编译器能够从文本文件中读入程序,然后输出编译的结果。(注意,你必须扩展你的编译器,让他能够支持减法和除法。)

第七单元作业 语义分析:C--语言的语义分析器

在这个题目中,你将亲自动手实现C--语义的语义分析器。具体的题目要求见:
http://staff.ustc.edu.cn/~bjhua/mooc/semant.html

第八单元作业 代码生成:C--语言的代码生成器

在这个题目中,你将亲自动手实现C--语义的语义分析器。具体的题目要求见:
http://staff.ustc.edu.cn/~bjhua/mooc/codegen.html

课程目录

第一单元: 编译器介绍
 第一讲 编译器概述
 第二讲 编译器结构
 第三讲 编译器实例
第二单元:词法分析(Part I)
 第一讲 词法分析的任务
 第二讲 词法分析器的手工构造
 第三讲 正则表达式
 第四讲 有限状态自动机
第三单元:词法分析(Part II)
 第一讲 RE 转换成 NFA : Thompson 算法
 第二讲 NFA 转换成 DFA : 子集构造算法
 第三讲 DFA 的最小化 : Hopcroft 算法
 第四讲 从 DFA 生成分析算法 
第四单元:语法分析(Part I)
 第一讲 语法分析的任务
 第二讲 上下文无关文法和推导
 第三讲 分析树和二义性文法
 第四讲 自顶向下分析
 第五讲 递归下降分析算法
第五单元:语法分析(Part II)
 第一讲 LL(1) 分析算法
 第二讲 LL(1) 分析算法的冲突处理
 第三讲 LR(0) 分析算法
 第四讲 SLR 分析算法
 第五讲 LR(1) 分析算法
 第六讲 LR(1) 分析工具
第六单元:语法制导与抽象语法树
 第一讲 语法制导翻译
 第二讲 语法制导翻译的实现原理
 第三讲 抽象语法树
 第四讲 抽象语法树的自动生成
第七单元:语义分析
 第一讲 语义分析的任务
 第二讲 语义规则及实现
 第三讲 符号表
 第四讲 语义分析的其他问题
第八单元:代码生成
 第一讲 代码生成的任务
 第二讲 栈计算机
 第三讲 面向栈计算机的代码生成
 第四讲 寄存器计算机及其代码生成
第九单元:中间代码与程序分析
 第一讲 中间代码的地位和作用
 第二讲 三地址码
 第三讲 控制流图
 第四讲 数据流分析
 第五讲 到达定义分析
 第六讲 活性分析
第十单元:代码优化
 第一讲 代码优化概述
 第一讲 早期优化
 第一讲 中间代码优化

About

just exercise code for study of 163

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

Languages

AltStyle によって変換されたページ (->オリジナル) /