编译原理compiler实验指导书.docx

上传人:b****7 文档编号:11329417 上传时间:2023-02-27 格式:DOCX 页数:19 大小:21.82KB
下载 相关 举报
编译原理compiler实验指导书.docx_第1页
第1页 / 共19页
编译原理compiler实验指导书.docx_第2页
第2页 / 共19页
编译原理compiler实验指导书.docx_第3页
第3页 / 共19页
编译原理compiler实验指导书.docx_第4页
第4页 / 共19页
编译原理compiler实验指导书.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

编译原理compiler实验指导书.docx

《编译原理compiler实验指导书.docx》由会员分享,可在线阅读,更多相关《编译原理compiler实验指导书.docx(19页珍藏版)》请在冰豆网上搜索。

编译原理compiler实验指导书.docx

编译原理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.yy

2.测试目录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-dis

6)将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*|/

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1