编译原理compiler实验指导书.docx
《编译原理compiler实验指导书.docx》由会员分享,可在线阅读,更多相关《编译原理compiler实验指导书.docx(19页珍藏版)》请在冰豆网上搜索。
![编译原理compiler实验指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/26/5fbbc83d-35a1-4a6c-9ee3-1d4729c4d4e2/5fbbc83d-35a1-4a6c-9ee3-1d4729c4d4e21.gif)
编译原理compiler实验指导书
编译原理
实验指导书
课程名称:
编译原理
英文名称:
CompilerPrinciple
课程性质:
必修
编写人:
编译原理课程组
2013年9月1日
计算机学院
1.
阅读说明
±基础实验☺、选做实验☻、实验中的附加内容★
±未加标注的实验为参考实验
2.实验要求
✧从以下方案中选一
±方案A(成绩上限:
120%)
-完成1个基础实验☺:
90%
-完成选做实验☻或实验中的附加内容★:
30%
±方案B(成绩上限:
150%)
-完成综合实验3.1:
150%
3.成绩评定
✧成绩评定依据
±原创性、工作量(自己编写的代码部分才能得分,参考的部分不得分)
±代码质量、丰富的测试用例、功能和实现上的独立思考与创新
±实验验收顺序、主动性
✧评分标准
±源码、验收、答辩(90%)
±实验报告、作品及文档提交(10%)
4.验收流程
✧必须携带打印版实验报告进行验收,验收顺序依据实验报告提交的顺序
✧验收分“申优验收”和“抽查”两种形式,参加“申优验收”才能获得B(百分制85%)以上的成绩。
✧必须当面验收的实验-选做内容、选做实验、综合实验
5.设计文档要求
✧设计文档参照模板书写。
✧所有实验必须提交设计文档的打印版本(A4)
6.作品提交要求
✧参加“申优验收”的同学需提交作品的电子文档及源码,
否则,只需提交打印版实验报告。
✧将作品打包成.rar文件发送至指定电子邮箱
邮箱地址:
ytuCompiler@
✧请大家参考以下目录命名与结构提交实验所有文档及源码
COMPILER_班级_学号_姓名_本次实验名称(根目录)
├bin存放可执行程序
├config存放各种配置文件
├lib存放类库文件
├doc存放设计文档及readme.txt
├src存放源程序及项目工程文件
├test存放测试程序
├references存放参考文档、代码、其他资源
根目录命名举例:
COMPILER_0813_200825501101_张三_实验1.1
❑若发现程序或文档雷同,按作弊处理
°完全雷同,取消参加期末考试资格,本学期理课程总评成绩为0分。
°部分雷同,扣除相应分数。
❑代码中如果有参考的部分,一定要在设计文档中对原创性进行说明,否则按作弊处理。
I单元实验
实验1.1根据状态转换图手工构造词法分析程序
☺★★★
一、实验目的
1.理解词法分析器的基本功能
2.理解词法规则的描述方法
3.理解状态转换图及其实现
4.能够编写简单的词法分析器
二、实验平台
Windows+VC
三、基本内容
1.通过状态转换图实现对单词的识别。
a)状态转换图由教师指定
b)输入:
符号串
输出:
yes/No–该符号串是否符合状态转换图的定义
2.从以下方法中选一实现
a)直接转向法
b)表驱动法
四、附加内容
★★从文件中读入符号串,从中识别出指定的单词。
±能连续识别出多个单词
±尽可能匹配最长串
★词法分析程序被主函数调用,每次调用返回1个单词。
五、设计文档
1.分析直接转向法和表驱动法的优缺点
六、参考资料
1.Tiny编译器
实验1.2用FLEX自动构造词法分析程序
一、实验目的
1.学习使用词法分析程序自动构造工具Flex
2.熟悉LEX源程序语法
3.掌握词法分析程序的自动构造方法
二、实验平台
Windows+Flex
三、基本内容
1.实现以下步骤,掌握Flex的工作过程
i.构造LEX源程序,例如命名为Test.Lex
ii.编译LEX源程序,生成C语言词法分析程序lex.yy.c,步骤如下:
在DOS命令提示符下执行编译flexTest.Lex得到目标文件lex.yy.c
iii.在VC中编译lex.yy.c,产生可执行程序lex.yy.exe
iv.运行生成的可执行文件lex.yy或lex.yy2.测试目录SRC_FLEX中的范例程序,了解其功能及实现。
四、附加内容
五、设计文档
六、参考资料
1.LEX范例程序:
SRC_FLEX
实验1.3在Windows平台下使用Flex和Bison
★★★
一、实验目的
1.学习使用语法分析程序自动构造工具Bison
2.熟悉YACC源程序语法
3.掌握语法分析程序的自动构造方法
二、实验平台
Windows+Flex+Bison
三、基本内容
1.实现以下步骤,掌握Flex和Bison的工作过程
a)在DOS命令提示符下依次执行以下两行命令
flexcalc.lex
bison-ocalc.ccalc.y
b)编译运行calc.c
2.测试目录SRC_BISON中的范例程序,了解其功能及实现。
3.参考范例程序,用Flex和Bison实现一个功能更为强大的计算器,包含以下运算:
a)加、减、乘、除运算
b)乘方、开方运算
c)位运算
–与&、或|、非~...
d)阶乘运算!
四、附加内容
1.进一步完善计算器功能,实现对以下语法结构的分析
★12+23*34+sin(45)/cos(56)-67
2.用Flex和Bison实现以下翻译方案。
★输入中缀表达式,输出后缀表达式
例如:
输入3+4*5
输出345*+
G:
EE+T{print‘+’}
ET
TT*F{print‘*’}
TF
F(E)
Fi{print‘i’}
★输入二进制数,输出十进制数
G:
NS1.S{N.v=S1.v+S.v*2-S.L}
SS1B{S.v=S1.v*2+B.v,S.L=S1.L+1}
SB{S.v=B.v,S.L=1}
B0{B.v=0}
B1{B.v=1}
★读入输入符号串,若输入符号串合法,则输出括号()的对数
SSprint(S.num)
S(L)S.num:
=L.num+1
SaS.num:
=0
LL1,SL.num:
=L1.num+S.num
LSL.num:
=S.num
五、设计文档
六、参考资料
1.BISON范例程序:
SRC-BISON
实验1.4递归下降分析
☺★★★
一、实验目的
1.加深对递归下降分析过程的理解。
二、实验平台
Windows+VC
三、基本内容
1.运行参考程序,了解递归下降分析原理。
2.针对一个新文法构造递归下降分析程序。
a)对该文法进行LL
(1)判别,若不是LL
(1)文法,则进行等价变换。
b)构造预测分析表。
c)针对文法构造递归下降分析程序。
四、附加内容
★从文件中读入若干个符号串,依次输出语法分析的结果
★★用可视化工具输出语法树
五、设计文档
1.LL
(1)判别过程和预测分析表可以手写,附在实验报告后面。
六、参考资料
1.递归下降分析程序:
“递归下降.c”
此程序对应的文法如下:
G:
(1)E→TG
(2)G→+TG|-TG
(3)G→ε
(4)T→FS
(5)S→*FS|/FS
(6)S→ε
(7)F→(E)
(8)F→i
实验1.5预测分析
☺★★★
一、实验目的
1.深入理解LL
(1)文法的预测分析过程。
二、实验平台
Windows+VC
三、实验内容
1.运行参考程序,了解预测分析原理。
2.针对一个新文法构造预测分析程序。
a)对该文法进行LL
(1)判别,若不是LL
(1)文法,则进行等价变换。
b)构造预测分析表。
c)针对文法构造预测分析程序。
四、附加内容
★从文件中读入若干个符号串,依次输出语法分析的结果。
★★用可视化工具输出语法树。
五、设计文档
1.LL
(1)判别过程和预测分析表可以手写,附在实验报告后面。
六、参考资料
1.LL.c
实验1.6LR分析
☺★★★
一、实验目的
1.深入理解LR分析过程。
二、实验平台
Windows+VC
三、实验内容
1.运行参考程序,了解LR分析原理。
2.针对一个新文法构造LR分析程序。
a)构造LR分析表。
b)针对文法构造LR分析程序。
四、附加内容
★从文件中读入若干个符号串,依次输出语法分析的结果。
★★用可视化工具输出语法树。
五、设计文档
1.LR分析表的构造过程可以手写,附在实验报告后面。
六、参考资料
1.LR.c
II扩展实验
实验2.1为SLEX修正bug
☻
一、实验目的
1.通过修正SLex的bug深入了解词法分析程序的工作原理。
二、实验平台
Windows+Slex
三、基本内容
1.修正Slex的bug
−用Slex编译一个lex源程序,得到LEXYY.C
−编译LEXYY.C得到LEXYY.EXE
−运行LEXYY.EXE,以一个文件作为输入,会发现无法正常退出
四、附加内容
五、设计文档
1.详细写出bug修正方案。
六、参考资料
实验2.2理解AnsiC的文法规则
☻
一、实验目的
1.进一步理解Lex和Yacc的工作原理
2.理解AnsiC的文法规则
二、实验平台
Lex+Yacc
三、基本内容
1.阅读AnsiC的Lex和Yacc源程序,理解词法和语法规则
2.对AnsiC的文法进行改进:
(1)添加'++'和'––'操作符
提示:
在词法分析程序段添加正规式,同时在Yacc程序的前缀表达式和后缀表达式中添加相应的文法规则,也可以只在Yacc程序段中添加文法规则。
(2)限定标识符长度为32个字符,超过32个字符部分无效,并给出警告信息。
提示:
在词法分析程序段中添加计算标识符长度的函数,并根据计算结果做出相应处理。
、
四、附加内容
五、设计文档
六、参考资料
1.参考源码:
ANSICgrammar(Lex).htm
ANSICgrammar(Yacc).htm
实验2.3搭建LLVM环境
☻
一、实验目的
1.了解LLVM的工作原理及环境搭建
二、实验平台
Ubuntu+Flex+Bison+LLVM
三、基本内容
1.搭建LLVM环境
1)下载LLVM安装包
2)安装Ubuntu
3)安装g++
$sudoapt-getinstallg++
4)安装flex
$sudoapt-getinstallflex
5)安装bison
$sudoapt-getinstallbison
6)安装clang
$sudoapt-getinstallclang
7)安装llvm-3.0
$cdllvm-3.0.src
$sudo./configure
$sudomake
$sudomakeinstall
8)安装llvm-gcc-4.5
$sudoapt-getinstallllvm-gcc-4.5
2.测试
1)调用clang生成可执行文件hello
$clanghello.c-ohello–v
使用-v选项能看到,clang负责生成了汇编文件.s,然后/usr/bin/gcc负责将汇编文件转为.o文件,进而生成hello可执行文件。
2)运行可执行文件hello
$./hello
3)调用clang生成LLVM中间表示文件.bc (LLVMbitcode文件)
$clanghello.c-c-ohello.bc-emit-llvm-v
4)调用LLVM虚拟机解释执行
$llihello.bc
5)转换为可读模式的LLVM中间表示,反汇编
llvm-dis6)将LLVM中间表示转换为本地的汇编语言文件
$llchello.bc-ohello.s
7)调用GCC将汇编文件直接转换为本地可执行文件
$gcchello.s-ohello.native
8)执行
$./hello.native
9)调用llvm-g++的编译前端为test.cc生成相应的LLVMbitcode文件
$llvm-g++test.cc-emit-llvm-c-otest.bc
(Potentialincompatiblepluginversion.GCC:
4.5.3.Expected:
4.5.4
Defines'dragonegg_disable_version_check'asenvvariabletoremovethiswarning
Pleasenotethatunexpectederrorsmightoccur. )
10)在调用llvm-g++的过程中添加上选项—verbose,
以确认llvm-g++前端在编译过程中使用的是正确的头文件
$llvm-g++--verbosetest.cc-emit-llvm-c-otest.bc
11)加上-S选项,生成LLVM的汇编格式文件
$llvm-g++-Stest.cc--emit-llvm
四、附加内容
五、设计文档
六、参考资料
1.参考网站:
www.llvm.org
2.参考源码:
hello.c,test.cc
实验2.4使用LLVM创建一个编译器
☻★★
一、实验目的
1.了解一个完整编译器的创建过程
二、实验平台
Ubuntu+Flex+Bison+LLVM
三、基本内容
1.对Toy编译器进行调试。
四、附加内容
★★对Toy编译器进行功能扩展。
五、设计文档
六、参考资料
1.参考源码:
Toy编译器(LLVM3.0)
III综合实验
实验3.1对选定的语言实现编译器前端
☺☺☺☺☺☺★★
一、实验目的
1.掌握编译器前端的实现过程
二、实验平台
任选
三、实验内容
1.选定附录中的一个文法,分析其描述的语言,确定语言中的终结符和非终结符。
±若选了标注★的语言,则自起评点额外获得相应★
2.分析文法的二义性
3.编写源程序
✧编写两个以上语法正确的源程序,要求用到该语言的所有语法结构。
如果有可能,你编写的源程序最好有实际意义,比如求平均值、阶乘、斐波那契序列等
✧编写两个以上有语法错误的源程序,既包含词法错误,也包含语法错误
✧以上源程序可作为测试用例
4.构造词法分析程序
✧若文法中包含词法定义,将词法定义分离出来;否则自己补全词法定义。
将词法定义写成正则表达式的形式。
✧可以采用手工构造方式,也可以选择自动生成方式
5.构造语法分析程序
✧可以采用手工构造方式,也可以选择自动生成方式
✧注意:
若采用递归下降分析法,当文法不满足LL
(1)条件时,需等价变换为LL
(1)文法
✧对一个存在词法错误或语法错误的源程序,需至少指出一处语法错误的原因及其位置(错误产生的位置定位允许有偏差)
✧可尝试在错误中恢复并继续进行语法分析
6.为其添加相应的语义动作,生成中间代码。
✧中间代码可以采用三地址代码或抽象语法树
四、附加内容
五、设计文档
六、参考资料
1.参考源码:
PL0编译程序
附录
附录A
T0语言
ProgramBEGINStmt-ListEND
Stmt-ListStmt-ListStmt
|Stmt
StmtAssign-stmt
Assign-stmtID=Expr;
ExprExprAdd-OpTerm
|Term
TermTermMultiple-OpFactor
|Factor
Factor(Expr)
|ID
|NUM
Add_Op+|-
Multiple_Op*|/
T1语言★
ProgramBEGINStmt-ListEND
Stmt-ListStmt-ListStmt
|Stmt
StmtAssign-stmt
|Read-stmt
|Write-stmt
Assign-stmtID=Expr;
Read-stmtREAD(IdList);
Write-stmtWRITE(ExprList);
Id-ListId-List,ID
|ID
Expr-ListExpr-List,Expr
|Expr
ExprExprAdd-OpTerm
|Term
TermTermMultiple-OpFactor
|Factor
Factor(Expr)
|ID
|NUM
Add_Op+|-
Multiple_Op*|/
T2语言★★
ProgramBEGINStmt-ListEND
Stmt-ListStmt-ListStmt
|Stmt
StmtAssign-stmt
|Read-stmt
|Write-stmt
|If-stmt
|Repeat-stmt
Assign-stmtID=Expr;
Read-stmtREAD(IdList);
Write-stmtWRITE(ExprList);
If-stmtIFExprTHENStmt-ListEND;
|IFExprTHENStmt-ListELSEStmt-ListEND;
Repeat-stmtREPEATStmt-ListUNTILExpr;
Id-ListId-List,ID
|ID
Expr-ListExpr-List,Expr
|Expr
ExprExprAdd-OpTerm
|Term
TermTermMultiple-OpFactor
|Factor
Factor(Expr)
|ID
|NUM
Add_Op+|-
Multiple_Op*|/