收藏 分享(赏)

《编译原理与实践》实验指导new.doc

上传人:dreamzhangning 文档编号:2725738 上传时间:2018-09-26 格式:DOC 页数:27 大小:105.50KB
下载 相关 举报
《编译原理与实践》实验指导new.doc_第1页
第1页 / 共27页
《编译原理与实践》实验指导new.doc_第2页
第2页 / 共27页
《编译原理与实践》实验指导new.doc_第3页
第3页 / 共27页
《编译原理与实践》实验指导new.doc_第4页
第4页 / 共27页
《编译原理与实践》实验指导new.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、1编译原理与实践实验指导苗巍实验一 词法分析【实验目的】通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。掌握对字符进行灵活处理的方法。程序开始变得复杂起来,可能是大家目前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。【实验学时】4 学时;【实验类型】设计型【实验内容】编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇到错误时可显示“Error

2、” ,然后跳过错误部分继续显示)程序要求:程序输入/输出示例:如源程序为 C 语言。输入如下一段:main()int a,b;a = 10;b = a + 20;要求输出如下图。2要求:识别保留字:if、int、for、while、do、return、break、continue;单词种别码为 1。其他的都识别为标识符;单词种别码为 2。常数为无符号整形数;单词种别码为 3。运算符包括:+、-、*、/、=、=、- -|- - |- +- -(2, ”main”)(5, ”(“)(5, ”) “)(5, ”“)(1, ”int”)(2, ”a”)(5, ”,”)(2, ”b”)(5, ”;”)(

3、2, ”a”)(4, ”=”)(3, ”10”)(5, ”;”)(2, ”b”)(4, ”=”)(2, ”a”)(4, ”+”)(3, ”20”)(5, ”;”)(5, ”) “)3- - =3 “超前搜索”方法词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a+”,当前字符为 ,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符+ ,这时可知应将解释为大于运算符。但此时,超前读了一个字符+ ,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。4模块结构【实验步骤】

4、(一)准备 1.阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。4(二)上机 将源代码拷贝到机上调试,发现错误,再修改完善。上机调试通过。(三)程序思路(仅供参考)这里以开始定义的 C 语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示) ,并产生两个表格:常数表和标识符表,它们分别包含了

5、源程序中的所有常数和所有标识符。0.定义部分:定义常量、变量、数据结构。1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。3.取单词后:去掉多余空白(可选,看着办) 。4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。 (关键是如何判断取单词结束?取到的单词是什么类型的单词?)5.显示结果。(四)程序代码/*词法分析程序代码*/#include #include #include #include #include #define NULL 0FILE *fp;char cbuffer;char *key8=“if“,“else“,“for“,“

6、while“,“do“,“return“,“break“,“continue“;char *border6=“,“,“;“,“,“,“(“,“)“;char *arithmetic4=“+“,“-“,“*“,“/“;char *relation6=“,“=“,“ ,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?2如何判断取单词结束?取到的单词是什么类型的单词?【实验报告要求】1模块设计:将程序分成合理的多个模块(函数) ,每个模块做具体的同一事情。2写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。3编程时注意编程风格:空行的使用、注释的使用、缩进的使用等

7、。10实验二 LL(1)分析法【实验目的】加深对预测分析 LL(1)分析法的理解。程序相当复杂,需要利用到大量的编译原理,也用到了大量编程技巧和数据结构,通过这个练习可大大提高软件开发能力。【实验学时】6 学时【实验类型】设计型【实验内容】 根据某一文法编制调试 LL(1)分析程序,以便对任意输入的符号串进行分析。程序输入/输出示例: 对下列文法,用 LL(1)分析法对任意输入的符号串进行分析: (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)LL(1)分析程序,编制人: 姓名,学号,班级(2)输入

8、一以#结束的符号串(包括+ */()i#): 在此位置输入符号串 (3)输出过程如下:步骤 分析栈 剩余输入串 所用产生式 1 E i+i*i# E-TG(4)输入符号串 为非法符号串(或者为合法符号串)备注:(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错” ;若成功结束则写为“分析成功” 。(2) 在此位置输入符号串 为用户自行输入的符号串。(3)上述描述的输出过程只是其中一部分的。 注意: 表达式中允许使用运算符(+-*/) 、分割符(括号) 、字符 i,结束符#; 11 如果遇到错误的表达式,应输出错误提示信

9、息(该信息越详细越好) ; 对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照。【实验原理】1LL(1)分析法的功能LL(1)分析法的功能是利用 LL(1)控制程序根据显示栈栈顶内容、向前看符号以及 LL(1)分析表,对输入符号串自上而下的分析过程。2LL(1)分析法的前提改造文法:消除二义性、消除左递归、提取左因子,判断是否为 LL(1)文法,3LL(1)分析法实验设计思想及算法【实验步骤】(一)准备 1.阅读课本有关章节,2.考虑好设计方案;3.设计出模块结构、测试数据,初步编制好程序。(二)

10、上机 将源代码拷贝到机上调试,发现错误,再修改完善。上机调试通过。(三)程序思路(仅供参考)模块结构:(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立 LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等) ;(3)控制部分:从键盘输入一个表达式符号串;(4)利用 LL(1)分析算法进行表达式处理:根据 LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。(四)程序代码/*LL(1)分析法源程序,只能在 VC+中运行 */12#include#include#include#includechar A20;/*分析栈*/c

11、har B20;/*剩余串*/char v120=i,+,*,(,),#;/*终结符 */char v220=E,G,T,S,F;/*非终结符 */int j=0,b=0,top=0,l;/*L 为输入串长度 */typedef struct type/*产生式类型定义 */char origin;/*大写字符 */char array5;/*产生式右边字符 */int length;/*字符个数 */type;type e,t,g,g1,s,s1,f,f1;/*结构体变量 */type C1010;/*预测分析表 */void print()/*输出分析栈 */int a;/*指针*/for

12、(a=0;a“,cha.origin);/*输出产生式*/for(j=0;j=0;j-)/*产生式逆序入栈*/A+top=cha.arrayj;if(Atop=)/*为空则不进栈*/top-;/*if*/else/*出错处理*/print();print1();printf(“%c 出错n“,x);/*输出出错非终结符*/exit(1);/*else*/*else*/while(finish=0);/*main*/【思考问题】1LL(1)分析法的功能是什么?162LL(1)分析法的前提是什么?3LL(1)分析法实验设计思想?【实验报告要求】1.模块设计:将程序分成合理的多个模块(函数) ,每个

13、模块做具体的同一事情。2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。17实验三 LR 语法分析及中间代码生成【实验目的】构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串(算术表达式)是否为该文法识别的句子。了解 LR(K)分析方法是严格的从左向右扫描、自底向上的语法分析方法。将语法分析识别的算术表达式转换为用逆波兰式来表示的中间代码,并计算用逆波兰式来表示的算术表达式的值。程序相当复杂,需要利用到大量的编译原理,也用到了大量编程技巧和数据结构,通过这个练习可大大提高软件开发能力。【实验学时】8

14、学时;【实验类型】综合型【实验内容】构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串(算术表达式)是否为该文法识别的句子。将语法分析识别的算术表达式转换为用逆波兰式来表示的中间代码,并计算用逆波兰式来表示的算术表达式的值。1LR(1)分析程序输入/输出示例: 对下列文法,用 LR(1)分析法对任意输入的符号串进行分析: (1)E-E+T(2)E-ET(3)T-T*F(4)T-T/F(5)F-(E)(6)F-i输出的格式如下:(1)LR(1)分析及中间代码生成程序,编制人:姓名,学号,班级(2)输入一以# 结束的符号串(包括+ */()i#):在此位置输入符号串 (3)输出过程如下

15、:步骤 状态栈 符号栈 剩余输入串 动作 1 0 # i+i*i# 移进(4)输入符号串为非法符号串(或者为合法符号串)备注:(a)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错” ;若成功结束则写为“分析成功” 。(b) 在此位置输入符号串为用户自行输入的符号串。注意: 18 表达式中允许使用运算符(+-*/ ) 、分割符(括号) 、字符 i,结束符#; 如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好) ; 对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的

16、输出结果写在另一个文本文件中,以便和输出进行对照。2逆波兰式的生成程序输入/输出示例:(1)逆波兰式的生成及计算程序,编制人:姓名,学号,班级(2)输入一以# 结束的中缀表达式(包括+ */()数字#):在此位置输入符号串如(28+68)*2# (3)逆波兰式为:28int goto1102=1,2, /*QOTO 表*/0,0,0,5,0,8,0,0,0,0,0,9,0,0,0,0,0,0;char vt3=a,b,#; /*存放非终结符*/char vn2=S,B; /*存放终结符*/char *LR4=“E-S#“,“S-BB#“,“B-aB#“,“B-b#“;/*存放产生式*/int

17、a10;char b10,c10,c1;int top1,top2,top3,top,m,n;void main()int g,h,i,j,k,l,p,y,z,count;23char x,copy10,copy110;top1=0;top2=0;top3=0;top=0;a0=0;y=a0;b0=#;count=0;z=0;printf(“请输入表达式n“);doscanf(“%c“,ctop3=c1;top3=top3+1;while(c1!=#);printf(“步骤t 状态栈tt 符号栈tt 输入串ttACTIONtGOTOn“);doy=z;m=0;n=0; /*y,z 指向状态栈栈

18、顶*/g=top;j=0;k=0;x=ctop;count+;printf(“%dt“,count);while(m#include#define max 100char exmax; /*存储后缀表达式*/void trans() /*将算术表达式转化为后缀表达式*/char strmax; /*存储原算术表达式*/25char stackmax; /*作为栈使用*/char ch;int sum,i,j,t,top=0;printf(“*n“);printf(“*输入一个求值的表达式,以#结束。*n“);printf(“*n“);printf(“算数表达式:“);i=0; /*获取用户输入

19、的表达式*/doi+;scanf(“%c“,while(stri!=# sum=i;t=1;i=1;ch=stri;i+;while(ch!=#)switch(ch)case (: /*判定为左括号*/top+;stacktop=ch;break;case ): /*判定为右括号*/while(stacktop!=()ext=stacktop;top-;t+;top-;break;case +: /*判定为加减号*/case -: while(top!=0top-;t+;top+;stacktop=ch;break;case *: /*判定为乘除号*/case /:while(stacktop

20、=*|stacktop=/)ext=stacktop;top-;t+;top+;stacktop=ch;break;case :break;default:while(ch=0 /*将数字字符转化为对应的数值*/ ch=ext;t+;top+;stacktop=d;ch=ext;t+;printf(“nt 计算结果:%gn“,stacktop);main()trans();compvalue();【思考问题】1使用 LR(1) 分析器的优点是什么?2LR 分析器由哪几个部分组成?3LR(1)分析法实验设计思想?4逆波兰式的生成实验设计思想?【实验报告要求】1.模块设计:将程序分成合理的多个模块(函数) ,每个模块做具体的同一事情。2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报