2022年编译原理实验指导 .pdf

上传人:Q****o 文档编号:30528448 上传时间:2022-08-06 格式:PDF 页数:16 大小:157.30KB
返回 下载 相关 举报
2022年编译原理实验指导 .pdf_第1页
第1页 / 共16页
2022年编译原理实验指导 .pdf_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《2022年编译原理实验指导 .pdf》由会员分享,可在线阅读,更多相关《2022年编译原理实验指导 .pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、计算机图形学实验指导书课程名称: 编译原理英文名称: Compiler Principle 课程性质: 必修 / 限选编写人: 孔繁茹卢云宏2010 年 9 月 1 日计算机学院名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 16 页 - - - - - - - - - 2 阅读说明未加标注的为必做实验标有 的为选做实验实验要求每个小组不超过4 人,需要完成以下任务必做实验 : 全部完成(70%) 实验 1.1 (20%) 实验 1.2 (10%) 实验 1.3 (20%

2、) 实验 1.4 (10%) 选做实验 : 至少完成3 个 (30%) 实验报告(10%) 实验成绩上限(120%) 第 1 部分单元实验实验 1.1 根据状态转换图手工构造词法分析程序一、实验目的1. 理解词法分析器的基本功能2. 理解词法规则的描述方法3. 理解状态转换图及其实现4. 能够编写简单的词法分析器二、实验平台C/C+ 三、实验内容手工构造一个简单的词法分析程序, 能够识别标识符、整数、关键字、算符、界符。1. 画出识别所有单词的状态转换图。(若状态转换图过于复杂,可以只画出主要部分) 2. 根据状态转换图手工构造词法分析程序。从以下方法中选一:词法分析器可以作为独立的一遍也可以

3、作为一个子程序被语法分析器调用3. 实现状态转换图。从以下方法中选一:直接转向法表驱动法四、设计文档1. 画出状态转换图若通过正规式或正规文法手工转换得到,需写明转换步骤名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 16 页 - - - - - - - - - 3 若通过正规式或正规文法编程转换得到,需附源程序清单2. 分析直接转向法和表驱动法的优缺点五、参考资料1. 程序设计语言编译原理国防陈火旺3.2 词法分析器的设计实验 1.2 用 LEX 自动构造词法分析程序一

4、、实验目的1.掌握词法分析程序的自动构造方法2.掌握词法分析程序自动构造工具Lex 的工作原理和使用方法3.熟悉 LEX 源程序语法4.学习使用自动构造软件SLex 二、实验平台Windows + Slex 三、实验内容1实现以下步骤, 掌握 SLex 的工作过程a) 构造 LEX 源程序 , 例如命名为Test.Lexb) 编译 lex 源程序,生成C 语言词法分析程序lexyy.c在 DOS 命令提示符下执行编译Slex Test.Lex 得到目标文件lexyy.cc) 改写生成的C 语言代码 lexyy.c ,增加主函数 (如果没有 ) main ( ) yylex(); d) 编译le

5、xyy.c,产生可执行程序lexyy.exee) 运行生成的可执行文件lexyy Test2.pl0f) 察看运行结果,并对结果进行分析2. 编写 LEX 源程序 , 使其自动生成的C 程序能够实现以下功能(至少完成 2 个) 复制一个文件,将文件中每个非空的空白符号序列替换为单个空格将输入文件中的所有小写字母转换成大写字母,将转换后的文件存入另一个文件,同时在屏幕上输出转换后的文件内容。输入一个C 源程序文件 , 将其中的所有关键字(即保留字 )均转换为大写字母, 将转换后的文件存入另一个文件,同时在屏幕上输出转换的关键字个数。将输入文件中的标识符输出到屏幕上。将输入文件中所有能被9 整除的

6、整数输出到屏幕上。为输入文件的每一行打印行行号。统计输入文件中的字符个数、字母个数、各类单词个数、行数。(字符包括空格、制表符,不包括换行符) 把一个文件改变为“ Pig Latin ” 文. 假设该文件是一个用空白符分隔开的单词(字母串 )序列 , 每当你遇到一个单词时: (1) 如果第一个字母是辅音字母, 则将它移到单词的结尾, 并加上ay 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - 4 (2) 如果第一个字母是元音字

7、母, 则只在单词的结尾加上ay 所有非字母的字符不加处理直接复制到输出3. 用 Lex 自动生成词法分析程序词法分析的输出存入文件中, 输出的单词序列格式可以自己定义4. 修正 Slex 的 bug Slex 本身存在Bug,每次运行后不能正常退出。注意:因此前已有学生完成了bug 修正,所以只有提出不同的修正方案,或者更好的修正方案,才可以得分。四、设计文档1. 分析 Test.lex 的功能2. 分析词法分析程序的自动生成原理3. 分析自动生成的词法分析程序的结构4. 若对 Slex 的 bug 进行了修正 , 详细写出修正方案。五、参考资料1. lex 源程序 : Test.lex 2.

8、 参考函数 : atoi() 将字符串转换成整数。例如,调用atoi(“ 123” ),得到整数123 实验 1.3 递归下降分析一、实验目的1. 加深对递归下降分析的理解。二、实验平台Windows + VC 三、实验内容1. 选择一个文法或自己设计一个文法(应与范例中的文法不同),写出文法接受的语言。2. 对该文法进行LL(1) 判别,若不是LL(1) 文法,则进行等价变换。3. 针对文法手工构造递归下降分析程序,实现以下功能:输入一符号串 , 输出语法分析的结果(接受 /出错 )。从文件中读入若干个符号串, 依次输出语法分析的结果用可视化工具输出语法树四、设计文档1. 文法、文法描述的语

9、言、预测分析表五、参考资料1. 递归下降分析程序: “ 2-递归下降 .c ”名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 16 页 - - - - - - - - - 5 此程序对应的文法如下:G: (1) ETG(2) G +TG|-TG (3) G (4) TFS(5) S*FS|/FS(6) S(7) F(E)(8) Fi实验 1.4 在 Windows 平台下使用 Flex 和 Bison 一、实验目的1. 学习使用词法分析程序自动构造工具Flex 和语法分析

10、程序自动构造工具Bison 二、实验平台Windows + Flex + Bison 三、实验内容1. 实现以下步骤 , 掌握 Flex 和 Bison 的工作过程a) 在 DOS 命令提示符下依次执行以下两行命令flex -olexyy.c calc.lex bison -ocalc.c calc.y b) 编译运行calc.c c) 分析运行结果2. 用 Flex 和 Bison 实现以下功能(1) 扩充范例程序 , 实现以下功能之一乘方、开方运算按位运算 与、或、非 . 三角函数运算 sin 、cos. 其他功能(2) 编写 Yacc 程序,使其自动生成的C 程序能够实现以下功能: 输入

11、中缀表达式, 输出后缀表达式参考属性文法 : G: E E T print + E T T T*F print * T F F (E) F i print i (3) 扩充范例程序 , 实现实数运算(4) 编写 Yacc 程序 , 使其自动生成的C 程序能够实现以下功能: 输入二进制数 , 输出十进制数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - 6 参考属性文法G: N S1.S N.v=S1.v+S.v*2-S.L S

12、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 (5) 对给定文法G编写 Yacc 程序,使其自动生成的C 程序能够实现以下功能: 读入输入符号串,若输入符号串合法,则输出括号() 的对数G: S ( L ) | a L L , S | S 参考语义规则:S S print (S. num) S ( L ) S. num := L.num + 1 S a S. num := 0 L L1 , S L. num := L1. num + S. num L S L. num := S.num 四、设计文档1

13、. 详细说明参考源程序calc.lex和 calc.y实现的功能。2. 介绍自己添加的新功能。附程序源码、测试用例。3. 完成附加题目的同学,附语义规则、程序源码、测试用例五、参考资料1. 源程序 : calc.lex calc.y 实验 1.5 用 YACC 自动构造语法分析程序一、实验目的1.掌握语法法分析程序的自动构造方法2.掌握语法分析程序自动构造工具Yacc的工作原理和使用方法3.熟悉 Yacc 源程序语法4.学习使用自动构造软件Yacc 二、实验平台Windows + Slex + Yacc 三、实验内容用 LEX 和 YACC 自动构造一个PL/0 程序的命令行解释程序,要求具有

14、变量和常量定义语句 Var 和 Const,具有基本输入输出语句Read 和 Write,包含基本的算术运算+ 、-、* 、/ 和( ) 运算,语句以分号(; )结束 ,整个程序以END 结束。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - - - - 7 1. 学习 YACC 语法的使用2. 使用 LEX 构造词法分析程序yylex.c 3. 使用 YACC 构造语法分析程序实现以下步骤 , 掌握 Yacc的工作过程a) 构造 YACC

15、 源程序 , 例如命名为PL0.YAC b) 编译 Yacc源程序,生成C 语言语法分析程序pl0.C在 DOS 命令提示符下执行编译YACC pl0.yac 产生 C 语言代码pl0.C c) 编译 pl0.C,产生可执行程序pl0.exe d) 在 DOS 命令提示符下执行生成的pl0.exe 输入程序示例如下: Const a =3 ; Var b,c ; Read(b); c := a + b ; Write(c) ; END. e) 察看运行结果,并对结果进行分析四、设计文档1. 解答 : YACC 所依据的文法是什么?2. 分析语法分析程序的自动生成原理。2. 分析生成的语法分析程

16、序是如何工作的。五、参考资料1. Yacc源程序 : pl0.yac实验 1.6 用 JFlex 构造词法分析程序一、实验目的1. 学习使用 Jflex 二、实验平台Java 三、实验内容1. 设计一个简单的语言,用正规式描述其词法规则。2. 下载词法分析程序自动生成工具JFlex JFlex 本身采用 Java 语言编写,并且生成Java 语言的词法分析源程序。下载 Flex,根据你自己的安装配置,修改JFlex 安装目录下脚本文件binjflex.bat中的两个环境变量JFLEX_HOME 和 JAVA_HOME的设置。然后运行JFlex 附带的输入源文件例子,以验证你是否正确安装并配置了

17、JFlex。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - - - - - - - - - 8 3. 生成词法分析程序参考 JFlex 使用手册,构造词法分析程序。四、设计文档1. 语言、词法规则描述、附JFlex 源文件。五、参考资料1. 相关链接:http:/www.jflex.de/download.htmlhttp:/ 1.7 用 JavaCUP 构造语法分析程序一、实验目的1. 学习使用 JavaCUP 二、实验平台Java 三、实验内容1. 从附

18、录中选择一个语言。2. 下载语法分析程序自动生成工具JavaCUP JavaCUP 本身采用 Java语言编写,并且生成Java语言的语法分析源程序。下载 JavaCUP,运行附带的输入源文件例子(一个基于命令行的简单计算器应用),以保证你正确安装并配置了JavaCUP。3. 生成语法分析程序参考 JavaCUP 使用手册,构造语法分析程序。四、设计文档1. 语言、语法规则描述、附JavaCUP 源文件。五、参考资料1. 相关链接:http:/www2.cs.tum.edu/projects/cup/ 第 2 部分综合实验实验 2.1 理解 Ansi C 的 文法规则一、实验目的名师资料总结

19、- - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 16 页 - - - - - - - - - 9 1. 进一步理解Lex 和 Yacc 的工作原理2. 理解 Ansi C 的文法规则二、实验平台Lex + Yacc 三、实验内容1. 阅读 Ansi C 的 Lex 和 Yacc 源程序,理解词法和语法规则2. 对 Ansi C 的文法进行改进:(1) 添加+ + 和 操作符提示 : 在词法分析程序段添加正规式,同时在Yacc 程序的前缀表达式和后缀表达式中添加相应的文法规则,也可以只在

20、Yacc 程序段中添加文法规则。(2) 限定标识符长度为32 个字符,超过32 个字符部分无效,并给出警告信息。提示 : 在词法分析程序段中添加计算标识符长度的函数,并根据计算结果做出相应处理。 、五、参考资料1. 参考源码 : ANSI C grammar (Lex).htm ANSI C grammar (Yacc).htm 实验 2.2 扩充 PL/0 编译程序一、实验目的1. 掌握自上而下的语法分析方法2. 掌握递归子程序的书写方法3. 了解编译器前端的实现过程二、实验平台C 或 Pascal 三、实验内容从以下任务中选一:1. 扩充条件语句为 := IF THEN ELSE 2. 增

21、加重复语句为 := REPEAT ; UNTIL 3. 增加一维整型数组为VAR ( : ) 4. 增加 FOR 语句5. 增加 CASE 语句6. 增加多维数组四、设计文档名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 16 页 - - - - - - - - - 10 补充要求 : 1. 写出对 PL/0 语言扩充语句的的一般步骤。2. 给出 PL/0 扩充部分的语法描述图和巴科斯-瑙尔范式的文法表示。3. 对程序的修改部分给出注释。五、参考资料1. 参考源码 : P

22、L0 编译程序( Pascal版本 /C 版本)实验 2.3 对选定的语言实现编译器前端一、实验目的1. 掌握编译器前端的实现过程二、实验平台任选三、实验内容1.选定附录中的一个文法,分析其描述的语言,确定语言中的终结符和非终结符。若选了标注 的语言,则自起评点额外获得相应数。2.分析文法的二义性3.编写源程序编写两个以上语法正确的源程序,要求用到该语言的所有语法结构。如果有可能,你编写的源程序最好有实际意义,比如求平均值、阶乘、斐波那契序列等编写两个以上有语法错误的源程序,既包含词法错误,也包含语法错误以上源程序可作为测试用例4.构造词法分析程序若文法中包含词法定义,将词法定义分离出来;否则

23、自己补全词法定义。将词法定义写成正规式的形式。可以采用手工构造方式,也可以选择自动生成方式5.构造语法分析程序可以采用手工构造方式,也可以选择自动生成方式注意: 若采用递归下降分析法,当文法不满足LL(1) 条件时,需等价变换为LL(1)文法对一个存在词法错误或语法错误的源程序,需至少指出一处语法错误的原因及其位置 (错误产生的位置定位允许有偏差) 可尝试在错误中恢复并继续进行语法分析6.为其添加相应的语义动作,生成中间代码。中间代码可以采用三地址代码或抽象语法树五、参考资料1. 参考源码 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -

24、 - - - 名师精心整理 - - - - - - - 第 10 页,共 16 页 - - - - - - - - - 11 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 16 页 - - - - - - - - - 12 附录A. straight-line 语言Straight-line 语言的简洁EBNF 文法Stm Stm; Stm Stm id := Exp Stm print (ExpList) Exp id Exp num Exp Exp Binop E

25、xp Exp (Stm, Exp) ExpList Exp, ExpList ExpList Exp Binop + Binop -Binop Binop / B. SimpleBlock语言SimpleBlock 语言的简洁EBNF 文法simpleblock := LBRACE assignment RBRACEassignment := assignment_expression SEMICOLON assignment_expression := IDENTIFIER EQ expression expression := expression binary_operator expr

26、ession | LPAREN expression RPAREN | IDENTIFIER | INTEGER_LITERAL binary_operator := PLUS | MINUS | MULT | DIV | MOD一个 SimpleBlock 程序有一个内含0条或多条赋值语句的语句块组成,每条赋值语句由一个赋值表达式后跟分号(;)组成。C. QTiny 语言QTiny 语言的文法表示Program ( BEGIN StatementList END StatementList ( StatementList Statement | Statement Statement ( I

27、dent = Expr; | READ(IdList); | WRITE(ExprList); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 16 页 - - - - - - - - - 13 IdList IdList,Ident | Ident ExprList ExprList, Expr | Expr Expr Expr Op Factor | Factor Factor (Expr) | Ident | INT Op + | - Ident ID Qtiny

28、 语言范例程序BEGIN READ(X,AB); Z = (AB+(X+1); WRITE(X,AB,Z,X-AB,X+AB,X+1); END D. Tiny 语言Tiny 语言的文法表示Program stmt-sequence stmt-sequence stmt-sequence ; statement | statement statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt If-stmt if expr then stmt-sequence end | if expr then stmt-s

29、equence else stmt-sequence end repeat-stmt repeat stmt-sequence until expr assign-stmt identifier := expr read-stmt read identifier write-stmt write expr expr simple-expr comparison-op simple-expr | simple-expr comparision-op | = simple-expr simple-expr add-op term | term add-op + | - term term mult

30、iple-op factor | factor multiple-op * | / 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 16 页 - - - - - - - - - 14 factor (expr) | identifier | number identifier letter | letter number number digit | number digit letter a | b | | z | A | B | | Z digit ( 0 | 1

31、| | 9E. C0 语言C0 语言的文法表示 := +|- := * | := | |!=|= := _|a|.|z|A|.|Z := | := |.| := / 字符串中可以出现所有合法的可打印字符集中的字符 := := const,; := := +|- | := | := int := , ;:= (|void ) := := ( ) := int, int | := void main( ) := | := := | ( ) | := | | | ;|; | ; | ; | ; | ; := := if( ) else := | := while( ) := ( ) := ,| :=

32、 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 16 页 - - - - - - - - - 15 := scanf( ) := printf(,| ) := return ( ) F. MiniJava 语言MiniJava 语言文法表示Program MainClass ClassDecl* MainClass class id public static void main ( String id ) Statement ClassDecl class id V

33、arDecl* MethodDecl* class id extends id VarDecl* MethodDecl* VarDec Type id ; MethodDecl public Type id ( FormalList ) VarDecl* Statement* return Exp ; FormalList Type id FormalRest* FormalRest , Type id Type int boolean int id Statement Statement* if ( Exp ) Statement else Statement while ( Exp ) S

34、tatement System.out.println ( Exp ) ; id = Exp ; id Exp = Exp ; Exp Exp op Exp Exp Exp Exp . length Exp . id ( ExpList ) INTEGER LITERAL true false id this new int Exp new id () ! Exp ( Exp ) ExpList Exp ExpRest* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共

35、16 页 - - - - - - - - - 16 ExpRest ,ExpMiniJava 语言范例程序class Factorial public static void main(String a) System.out.println(new Fac().ComputeFac(10); class Fac public int ComputeFac(int num) int num_aux; if (num 1) num_aux = 1; else num_aux = num * (this.ComputeFac(num-1); return num_aux; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 16 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁