1、编译原理compiler实验指导书编译原理实验指导书课程名称 : 编译原理英文名称 : Compiler Principle课程性质 : 必修编写人 : 编译原理课程组2013年9月1日计算机学院1. 阅读说明 基础实验、选做实验、实验中的附加内容 未加标注的实验为参考实验2. 实验要求 从以下方案中选一 方案A (成绩上限:120%)- 完成1个基础实验: 90%- 完成选做实验或实验中的附加内容: 30% 方案B (成绩上限:150%)- 完成综合实验3.1: 150% 3. 成绩评定 成绩评定依据 原创性、工作量(自己编写的代码部分才能得分,参考的部分不得分) 代码质量、丰富的测试用例、
2、功能和实现上的独立思考与创新 实验验收顺序、主动性 评分标准 源码、验收、答辩 (90%) 实验报告、作品及文档提交 (10%)4. 验收流程 必须携带打印版实验报告进行验收,验收顺序依据实验报告提交的顺序 验收分“申优验收”和“抽查”两种形式,参加“申优验收”才能获得B(百分制85%)以上的成绩。 必须当面验收的实验 - 选做内容、选做实验、综合实验5. 设计文档要求 设计文档参照模板书写。 所有实验必须提交设计文档的打印版本(A4)6. 作品提交要求 参加“申优验收”的同学需提交作品的电子文档及源码,否则,只需提交打印版实验报告。 将作品打包成 .rar文件发送至指定电子邮箱邮箱地址: y
3、tuCompiler 请大家参考以下目录命名与结构提交实验所有文档及源码COMPILER_班级_学号_姓名_本次实验名称 (根目录) bin 存放可执行程序 config 存放各种配置文件 lib 存放类库文件 doc 存放设计文档及readme.txt src 存放源程序及项目工程文件 test 存放测试程序 references 存放参考文档、代码、其他资源根目录命名举例: COMPILER_0813_200825501101_张三_实验1.1 若发现程序或文档雷同,按作弊处理 完全雷同,取消参加期末考试资格,本学期理课程总评成绩为0分。 部分雷同,扣除相应分数。 代码中如果有参考的部分,
4、一定要在设计文档中对原创性进行说明,否则按作弊处理。I 单元实验实验1.1 根据状态转换图手工构造词法分析程序一、实验目的1. 理解词法分析器的基本功能2. 理解词法规则的描述方法3. 理解状态转换图及其实现4. 能够编写简单的词法分析器二、实验平台Windows + VC三、基本内容1. 通过状态转换图实现对单词的识别。a) 状态转换图由教师指定b) 输入: 符号串输出: yes / No 该符号串是否符合状态转换图的定义2. 从以下方法中选一实现a) 直接转向法b) 表驱动法四、附加内容 从文件中读入符号串,从中识别出指定的单词。 能连续识别出多个单词 尽可能匹配最长串 词法分析程序被主函
5、数调用,每次调用返回1个单词。五、设计文档1. 分析直接转向法和表驱动法的优缺点六、参考资料1. Tiny编译器实验1.2用FLEX自动构造词法分析程序一、实验目的1. 学习使用词法分析程序自动构造工具Flex2. 熟悉LEX源程序语法3. 掌握词法分析程序的自动构造方法二、实验平台Windows + Flex三、基本内容1. 实现以下步骤, 掌握Flex的工作过程i. 构造LEX源程序, 例如命名为Test.Lex ii. 编译LEX源程序, 生成C语言词法分析程序lex.yy.c, 步骤如下: 在DOS命令提示符下执行编译 flex Test.Lex 得到目标文件 lex.yy.c iii
6、. 在VC中编译lex.yy.c,产生可执行程序lex.yy.exe iv. 运行生成的可执行文件lex.yy 或 lex.yy InputFile 2. 测试目录SRC_FLEX中的范例程序,了解其功能及实现。四、附加内容五、设计文档六、参考资料1. LEX范例程序:SRC_FLEX实验1.3 在Windows平台下使用Flex和Bison一、实验目的1. 学习使用语法分析程序自动构造工具Bison2. 熟悉YACC源程序语法3. 掌握语法分析程序的自动构造方法二、实验平台Windows + Flex + Bison三、基本内容1. 实现以下步骤, 掌握Flex和Bison的工作过程a) 在
7、DOS 命令提示符下依次执行以下两行命令 flex calc.lexbison -ocalc.c calc.yb) 编译运行 calc.c2. 测试目录SRC_BISON中的范例程序,了解其功能及实现。3. 参考范例程序, 用Flex和Bison实现一个功能更为强大的计算器,包含以下运算:a) 加、减、乘、除运算b) 乘方、开方运算c) 位运算 与 & 、或 |、非 .d) 阶乘运算 ! 四、附加内容1. 进一步完善计算器功能,实现对以下语法结构的分析 12+23*34+sin(45)/cos(56)-672. 用Flex和Bison实现以下翻译方案。 输入中缀表达式, 输出后缀表达式 例如:
8、 输入3+4*5 输出 345*+G: E ET print +E T T T*F print *T FF (E) F i print i 输入二进制数,输出十进制数G: N S1.S N.v=S1.v+S.v*2-S.L S S1B S.v=S1.v*2+B.v, S.L=S1.L+1 S B S.v=B.v, S.L=1 B 0 B.v=0 B 1 B.v=1 读入输入符号串,若输入符号串合法,则输出括号( )的对数S S print (S. num)S ( L ) S. num := L.num + 1S a S. num := 0L L1 , S L. num := L1. num +
9、 S. numL S L. num := S.num 五、设计文档六、参考资料1. BISON范例程序:SRC-BISON实验1.4 递归下降分析一、实验目的1. 加深对递归下降分析过程的理解。二、实验平台Windows + VC三、基本内容1. 运行参考程序,了解递归下降分析原理。2. 针对一个新文法构造递归下降分析程序。a) 对该文法进行LL(1)判别,若不是LL(1)文法,则进行等价变换。b) 构造预测分析表。c) 针对文法构造递归下降分析程序。四、附加内容 从文件中读入若干个符号串, 依次输出语法分析的结果 用可视化工具输出语法树五、设计文档1. LL(1)判别过程和预测分析表可以手写
10、,附在实验报告后面。六、参考资料1. 递归下降分析程序: “ 递归下降.c ”此程序对应的文法如下:G: (1) ETG(2) G+TG|-TG(3) G(4) TFS(5) S*FS|/FS(6) S(7) F(E)(8) Fi实验1.5 预测分析一、实验目的1. 深入理解LL(1)文法的预测分析过程。二、实验平台Windows + VC三、实验内容1. 运行参考程序,了解预测分析原理。2. 针对一个新文法构造预测分析程序。a) 对该文法进行LL(1)判别,若不是LL(1)文法,则进行等价变换。b) 构造预测分析表。c) 针对文法构造预测分析程序。四、附加内容 从文件中读入若干个符号串, 依
11、次输出语法分析的结果。 用可视化工具输出语法树。五、设计文档1. LL(1)判别过程和预测分析表可以手写,附在实验报告后面。六、参考资料1. LL.c实验1.6 LR分析一、实验目的1. 深入理解LR分析过程。二、实验平台Windows + VC三、实验内容1. 运行参考程序,了解LR分析原理。2. 针对一个新文法构造LR分析程序。a) 构造LR分析表。b) 针对文法构造LR分析程序。四、附加内容 从文件中读入若干个符号串, 依次输出语法分析的结果。 用可视化工具输出语法树。五、设计文档1. LR分析表的构造过程可以手写,附在实验报告后面。六、参考资料1. LR.cII 扩展实验实验2.1 为
12、SLEX修正bug 一、实验目的1. 通过修正SLex的bug深入了解词法分析程序的工作原理。 二、实验平台Windows + Slex三、基本内容1. 修正Slex的bug 用Slex编译一个lex源程序,得到LEXYY.C 编译LEXYY.C 得到LEXYY.EXE 运行LEXYY.EXE,以一个文件作为输入,会发现无法正常退出四、附加内容五、设计文档1.详细写出bug修正方案。六、参考资料实验2.2 理解Ansi C的 文法规则一、实验目的1. 进一步理解Lex和Yacc的工作原理2. 理解Ansi C的文法规则二、实验平台Lex + Yacc三、基本内容1. 阅读Ansi C 的Lex
13、和Yacc源程序,理解词法和语法规则2. 对Ansi C 的文法进行改进: (1) 添加 + + 和 操作符提示: 在词法分析程序段添加正规式,同时在Yacc程序的前缀表达式和后缀表达式中添加相应的文法规则,也可以只在Yacc程序段中添加文法规则。 (2) 限定标识符长度为32个字符,超过32个字符部分无效,并给出警告信息。提示: 在词法分析程序段中添加计算标识符长度的函数,并根据计算结果做出相应处理。、四、附加内容五、设计文档六、参考资料1. 参考源码: ANSI C grammar (Lex).htmANSI C grammar (Yacc).htm实验2.3 搭建LLVM环境一、实验目的
14、1. 了解LLVM的工作原理及环境搭建 二、实验平台Ubuntu + Flex + Bison + LLVM三、基本内容1. 搭建LLVM环境1) 下载LLVM安装包2) 安装 Ubuntu3) 安装 g+$ sudo apt-get install g+4) 安装 flex$ sudo apt-get install flex5) 安装 bison$ sudo apt-get install bison6) 安装 clang$ sudo apt-get install clang7) 安装 llvm-3.0$ cd llvm-3.0.src$ sudo ./configure $ sudo
15、make $ sudo make install 8) 安装 llvm-gcc-4.5$ sudo apt-get install llvm-gcc-4.52. 测试1) 调用clang生成可执行文件hello$ clang hello.c -o hello v使用-v选项能看到,clang负责生成了汇编文件.s,然后/usr/bin/gcc负责将汇编文件转为.o文件,进而生成hello可执行文件。2) 运行可执行文件hello$./hello3) 调用clang生成LLVM中间表示文件.bc(LLVM bit code文件)$ clang hello.c -c -o hello.bc -em
16、it-llvm -v4) 调用LLVM虚拟机解释执行$ lli hello.bc5) 转换为可读模式的LLVM中间表示,反汇编llvm-dis hello.bc6) 将LLVM中间表示转换为本地的汇编语言文件 $ llc hello.bc -o hello.s7) 调用GCC将汇编文件直接转换为本地可执行文件$ gcc hello.s -o hello.native8) 执行$./hello.native9) 调用llvm-g+的编译前端为test.cc生成相应的LLVM bit code 文件$ llvm-g+ test.cc -emit-llvm -c -o test.bc (Potent
17、ial incompatible plugin version. GCC: 4.5.3. Expected: 4.5.4Defines dragonegg_disable_version_check as env variable to remove this warningPlease note that unexpected errors might occur.)10) 在调用llvm-g+的过程中添加上选项verbose,以确认llvm-g+前端在编译过程中使用的是正确的头文件$ llvm-g+ -verbose test.cc -emit-llvm -c -o test.bc 11)
18、 加上 -S 选项,生成 LLVM的汇编格式文件$ llvm-g+ -S test.cc -emit-llvm四、附加内容五、设计文档六、参考资料1. 参考网站: www.llvm.org2. 参考源码: hello.c, test.cc实验2.4 使用LLVM创建一个编译器一、实验目的1. 了解一个完整编译器的创建过程 二、实验平台Ubuntu + Flex + Bison + LLVM三、基本内容1. 对Toy编译器进行调试。四、附加内容 对Toy编译器进行功能扩展。五、设计文档六、参考资料1. 参考源码: Toy编译器 (LLVM 3.0)III 综合实验实验3.1 对选定的语言实现编译
19、器前端一、实验目的1. 掌握编译器前端的实现过程二、实验平台任选三、实验内容1. 选定附录中的一个文法,分析其描述的语言,确定语言中的终结符和非终结符。 若选了标注的语言,则自起评点额外获得相应2. 分析文法的二义性3. 编写源程序 编写两个以上语法正确的源程序,要求用到该语言的所有语法结构。如果有可能,你编写的源程序最好有实际意义,比如求平均值、阶乘、斐波那契序列等 编写两个以上有语法错误的源程序,既包含词法错误,也包含语法错误 以上源程序可作为测试用例4. 构造词法分析程序 若文法中包含词法定义,将词法定义分离出来;否则自己补全词法定义。将词法定义写成正则表达式的形式。 可以采用手工构造方
20、式,也可以选择自动生成方式 5. 构造语法分析程序 可以采用手工构造方式,也可以选择自动生成方式 注意:若采用递归下降分析法,当文法不满足LL(1)条件时,需等价变换为LL(1)文法 对一个存在词法错误或语法错误的源程序,需至少指出一处语法错误的原因及其位置(错误产生的位置定位允许有偏差) 可尝试在错误中恢复并继续进行语法分析6. 为其添加相应的语义动作,生成中间代码。 中间代码可以采用三地址代码或抽象语法树四、附加内容五、设计文档六、参考资料1. 参考源码: PL0编译程序附录附录AT0语言Program BEGIN Stmt-List ENDStmt-List Stmt-List Stmt
21、| StmtStmt Assign-stmt Assign-stmt ID = Expr;Expr Expr Add-Op Term | TermTerm Term Multiple-Op Factor | FactorFactor (Expr) | ID | NUMAdd_Op + | -Multiple_Op * | /T1语言 Program BEGIN Stmt-List ENDStmt-List Stmt-List Stmt| StmtStmt Assign-stmt | Read-stmt | Write-stmtAssign-stmt ID = Expr;Read-stmt RE
22、AD(IdList);Write-stmt WRITE(ExprList);Id-List Id-List, ID | IDExpr-List Expr-List, Expr | ExprExpr Expr Add-Op Term | TermTerm Term Multiple-Op Factor | FactorFactor (Expr) | ID | NUMAdd_Op + | -Multiple_Op * | /T2语言 Program BEGIN Stmt-List ENDStmt-List Stmt-List Stmt| StmtStmt Assign-stmt | Read-st
23、mt | Write-stmt| If-stmt| Repeat-stmt Assign-stmt ID = Expr;Read-stmt READ(IdList);Write-stmt WRITE(ExprList);If-stmt IF Expr THEN Stmt-List END; | IF Expr THEN Stmt-List ELSE Stmt-List END;Repeat-stmt REPEAT Stmt-List UNTIL Expr;Id-List Id-List, ID | IDExpr-List Expr-List, Expr | ExprExpr Expr Add-Op Term | TermTerm Term Multiple-Op Factor | FactorFactor (Expr) | ID | NUMAdd_Op + | -Multiple_Op * | /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1