版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、liaocheng university编译原理实验指导书聊城大学计算机学院2011年3月目录编译原理课程实验教学大纲1实验一词法分析器的设计3基本信息3实验目的3实验内容3实验扩充5实验说明5实验考核方式5实验辅导5实验二语法分析器的设计10基本信息10实验目的10实验内容10实验说明:10实验考核方式:10实验辅导11能力扩展19附录19编译原理课程实验教学大纲课程名称:编译原理英文名称:compile principles设置形式:非独立设课课程模块:专业方向课实验课性质:专业实验课程编号:509615课程负责人:姜华大纲主撰人:姜华大纲审核人:左风朝一、学时、学分 课程总学时:72实验
2、学时:8课程学分:4二、适用专业及年级计算机科学与技术、软件工程三年级三、课程目标与基本要求编译原理课程是计算机专业的核心课程,是培养计算机技术高级人才的必修课程。该课程通过程序设计语言和语言处理软件的理论与技术的教学,培养学生利用计算机语言处理技术进行系统分析和软件设计的能力。是理论与实践并重的课程,这门实验课要综合运用一、二、三年级所学的多门课程的内容。实验目标与要求; 1学会用高级程序设计语言设计词法分析器。 2学会用高级程序设计语言设计语法分析器。四、主要仪器设备windows操作系统,编程语言采用c、c+,集成调试环境采用tc或microsoft visual studio 6五、实
3、验项目及教学安排序号实验项目名称实 验 内 容学时要求性质类别所用主要仪器及台套数所在实验室1用c或者 c+ 语言设计一个词法分析器1.确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。2.把词法分析器设计成一个独立的过程。4必做设计综合型微机,每人一台。计算机学院实验中心2用c或者 c+语言设计一个语法分析器。1.词法分析和语法分析在一起实现。2. 把语法分析器设计成一个独的过程。4必做设计综合型微机,每人一台。计算机学院实验中心六、考核方式及成绩评定根据学生实验出勤情况、实验态度、实验报告成绩等方面评定实验成绩。实验报告平均成绩(含实验理论)占实验成绩的50%,实验技能
4、平均成绩(含实验态度)占实验成绩的50%。 实验成绩占该课程考试总成绩的1020%。在机器上将程序及运行结果上传至服务器,由实习教师给出优、良、中、及格、不及格。七、实验教科书、参考书1实验教科书自编实验指导书。 2实验参考书实验一词法分析器的设计基本信息实验课程:编译原理设课形式:非独立课程学分:4实验项目:词法分析器的设计项目类型:设计项目学时:4实验目的1. 掌握词法分析的原理;2. 熟悉符号表的建立与单词的分类方法;3. 掌握词法分析器的设计与调试;实验内容1. 分析如表1所定义的pascal语言子集的语法,找出所有单词的组成及类别;2. 完成单词的分类及其编码;3. 完成保留字表、变
5、量名表和常数表的结构设计;4. 建立识别单词符号集合的dfa;5. 由dfa设计词法分析程序;6. 调试并运行词法分析程序;7. 实验结果分析。分析结果含义并写出自己的心得体会。表1.pascal语言子集的语法定义程序变量说明begin语句表end.变量说明var变量表:类型;|空变量表变量表,变量|变量类型integer语句表语句表;语句|语句语句赋值语句|条件语句|while语句|复合语句|过程定义赋值语句变量=算术表达式条件语句if关系表达式then语句else语句while语句while关系表达式do语句复合语句begin语句表end过程定义procedure标识符参数表;begin语
6、句表end参数表(标识符表)|空标识符表标识符表,标识符|标识符算术表达式算术表达式+项|项项项*初等量|初等量初等量(算术表达式)|变量|无符号数关系表达式算术表达式关系符算术表达式变量标识符标识符标识符字母|标识符数学|字母无符号数无符号数数字|数字关系符=|=|=|字母a|b|c|x|y|z数字0|1|2|8|9空提示: (1) 单词的分类。 可将所有标识符归为一类;将常数归为另一类;保留字和分隔符则可采取一词一类。 (2) 符号表的建立。 可事先建立一保留字表,以备在识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。 (3) 单词串的输出形式。 所输出的每一单词,均按形如
7、(class,value)的二元式编码。对于变量标识符和常数,class字段为相应的类别码,value字段则是该标识符、常数在其符号表中登记项的序号 (要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该整数的二进制形式)。对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的class字段上放置相应的单词的类别码,value字段则为“空”。不过,为便于查看由词法分析程序所输出的单词串,也可以在class字段上直接放置单词符号串本身。 测试用输入:测试用输入程序为。 procedure program1(a, b);beginvar xyz=50
8、;while ab do beginif xyz=0 then xyz=50; xyz:=xyz-a; a:=a-1; endend实验扩充构造语言的词法分析程序,要求识别出变量类型并记录相关信息。实验说明实验环境:windows下,工具为turbo c2.0或visual c 6.0。实验考核方式1提交实验报告2演示程序和答辩(抽查)实验辅导1. 词法分析程序的功能词法分析程序又称为扫描器,其功能在于依次扫视字符串形式源程序中的各个字符,逐个识别出其中的单词,并将其转换为内部编码形式的单词符号串作确为输出。通常,可采用二元式(class,value)来表示一个单词符号的内部编码,其中:cla
9、ss为一整数码,用于表示该单词的类别;value则是该单词之值(如变量名在符号表中序号,常数的二进制表示,以及运算符和分隔符的编码等等)。概括地说,扫描器在其工作过程中,一般应完成下列的任务:(1)识别出源程序中的各个单词符号,并将其转换为内部编码形式;(2)删除无用的空白字符、回车字符以及其它非实质性字符;(3)删除注释;(4)进行词法检查,报告所发现的错误。此外,视编译工作流程的组织,一些编译程序在进行词法分析时,还要完成将所识别出的标识符登录到符号表的工作。 2. 实例分析对于表2所列的各类单词符号,词法分析程序可按图1所示的状态转换图来构造。表2 一个语言的单词符号及分类码表图1识别表
10、2所列语言单词的dfa及相关的语义过程相关变量和子程序说明如下:u 函数getchar每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。u 字符数组token用来依次存放一个单词词文中的各个字符。u 函数cat每调用一次,就把当前ch中的字符拼接于token中所存字符串的右边。u 函数lookup每调用一次,就以token中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。u 函数retract每调用一次,就把扫描指示器回退一个字符位置 (即退回多读的那个字符)。u 函数out一般仅在进入终态时调用此函数,调用的
11、形式为out (c,val)。其中,实参c为相应单词的类别码或其助记符;当所识别的单词为标识符和整数时,实参val为token (即词文分别为字母数字串和数字串),对于其余种类的单词,val均为空串。函数out的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。可参考的c语言源程序如下:# include # include # include # define id6# define int7# define lt8# define le9# define eq10# define ne11# define gt12# define ge13char token20;
12、extern int lookup (char*);extern void out (int, char*);extern reporterror (void);void scannerexample (file*fp)char ch;int i, c;ch=fgetc (fp);if (isalpha (ch)/*it must be a identifer!*/token0=ch;ch=fgetc (fp);i=1;while (isalnum (ch)tokeni=ch;i+;ch=fgetc (fp);tokeni=0fseek(fp,-1,1);/* retract*/c=looku
13、p (token);if (c=0) out (id,token);else out (c, );elseif(isdigit(ch)token0=ch;ch=fgetc(fp);i=1;while(isdigit(ch)tokeni=ch;i+;ch=fgetc(fp);tokeni=0;fseek(fp,-1,1);out(int,token);elseswitch(ch)case :ch=fgetc(fp);if(ch=)out(le, );else if(ch=) out (ne, );elsefseek (fp,-1,1);out (lt, );break;case =:out(eq
14、, );break;case :ch=fgetc(fp);if(ch=)out(ge, );elsefseek(fp,-1,1);out(gt, );break;default: reporterror( );break;return;实验二语法分析器的设计基本信息实验课程:编译原理设课形式:非独立课程学分:4实验项目:语法分析器的设计项目类型:设计项目学时:4实验目的1. 掌握自上而下语法分析的基本思想;2. 掌握利用预测分析法进行语法分析的原理和过程;3. 熟悉文法的机内表示;4. 掌握语法分析器的设计与调试,提高编程能力、动手能力以及独立分析问题、解决问题的能力和综合运用所学知识的能力。
15、实验内容1. 输入任意文法,改写文法使其成为ll(1)文法。 2. 构造文法的预测分析表;3. 设计堆栈和预测分析表的机内表示;4. 设计并书写语法分析程序;5. 调试并运行语法分析程序;6. 实验结果分析l 分析程序中文法存储所采用的数据结构l 分析结果并写出自己的心得体会提示: 对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。 实验说明:实验环境:windows下,工具为turbo c2.0或visual c 6.0。实验考核方式:1. 提交实验报告2. 演示程序和答辩(抽查)实验预习实验辅导1. 设计原理及算法描述 所谓ll(1)分析法,就是指从左到右
16、扫描输入串(源程序),同时采用最左推导,且对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现ll(1)分析的程序又称为ll(1)分析程序或ll1(1)分析器。 一个文法要能进行ll(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的first和follow集合,然后根据first和follow集合构造ll(1)分析表,最后利用分析表,根据ll(1)语法分析构造一个分析器。2. 分析过程ll(1)的语法分析程序包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该
17、程序是采用了c语言来编写,其逻辑结构图如图2所示。 图2 ll(1)语法分析逻辑结构图 ll(1)预测分析程序的总控程序在任何时候都是按stack栈顶符号x和当前的输入符号a做哪种过程的。对于任何(x,a)总控程序每次都执行下述三种可能的动作之一: ()若x = a =#,则宣布分析成功,停止分析过程。 ()若x = a #,则把x从stack栈顶弹出,让a指向下一个输入符号。 ()若x是一个非终结符,则查看预测分析表m。若ma,a中存放着关于x的一个产生式,那么,首先把x弹出stack栈顶,然后,把产生式的右部符号串按反序一一弹出stack栈(若右部符号为,则不推什么东西进stack栈)。若
18、ma,a中存放着“出错标志”,则调用出错诊断程序error。 事实上,ll(1)的分析是根据文法构造的,它反映了相应文法所定义的语言的固定特征,因此在ll(1)分析器中,实际上是以ll(1)分析表代替相应方法来进行分析的。 3. 构造ll(1)分析表 例如考查文法ge: ee+t | t tt*f | f f( e ) | i | 我们容易看出此文法没有左公因子也没有二义性,但却存在两个直接左递归,这里我们利用引入新非终结符的方法来消除它使方法满足要求,即: (1) 改写文法。对形如:uux|y的产生式(其中x,y v+ ,y不以u开头),引入一个新的非终结符u后,可以等价地改写成为: uyu
19、 ux u| 显然改写后,u和u都不是左递归的非终结符。因此文法ge按上述方法消去左递归后可等价地写成: etp p+tp | tfq q*fq | f( e ) | i (2) first和follow集合构造。在构造ll(1)预测分析表之前,首先要构造该文法的每个非终结符的first和follow集合,按照下面描述的算法来构造这两个集合。 first集合的构造算法: l 若xvt,则first(x)=x。 l 若xvn,且有产生式xa,则把a加入到first(x)中;若x也是一条产生式,则把也加到first(x)中。 l 若xy是一个产生式且yvn,则把first(y)中的所有非-元素都加
20、到first(x)中;若xy1y2yk是一个产生式,y1,yi-1都是非终结符,而且,对于任何j,1ji-1,first(yj)都含有(即y1yi-1* ),则把first(yj)中的所有非-元素都加到first(x)中;特别是,若所有的first(yj)均含有,j=1,2,,k,则把加到first(x)中。连续使用上面的规则,直至每个集合first不再增大为止。 follow集合的构造算法: l 对于文法的开始符号s,置#于follow(s)中; l 若ab是一个产生式,则把first()| 加至follow(b)中; l 若ab是一个产生式,或ab是一个产生式而(即first()),则把f
21、ollow(a)加至follow(b)中。 连续使用上面的规则,直至每个集合follow不再增大为止。 算法中利用二维数组分别表示各产生式右部的first和左部的follow集合(3)预测分析表构造。构造ge的ll(1)预测分析表。预测分析表ma, a是如下形式的一个矩阵。a为非终结符,a是终结符或#。矩阵元素 ma, a中存放这一条关于a的产生式,指出当a面临输入符号a是所应采用的规则。ma, a也可能存放一条“出错标志”,指出当a根本不该面临输入符号a。算法中利用二维数组存储分析表。 4. 利用分析表进行预测分析 (1) 总控程序的流程图ll(1)分析法总控程序流程图如图3所示。图3 ll
22、(1)分析法总控程序流程图(2) 总程序的算法描述如下:begin 首先把#然后把文法开始符号推进stack栈;把第一个输入符号读进a; flag:=true; while flag do begin 把栈顶符号出栈到x中; if x in vt then if x =a then 把下一输入符号读进a else error else if x= # then if x=a then flag:=false else error else if ma, a=xx1x2xk then 把xk, xk1, x1依次进栈 /*若x1, x2 xk=e,则不进栈*/ else errorend of
23、while; stop /*分析成功,过程结束*/ end (5) 实例分析 实例考查文法ge: ee+t | t tt*f | f f( e ) | i | 文法改造为ll(1)文法为测试文法ge: etg g+tg | tfs s*fs | f( e ) | i分析例句:i*(i)# , i+i#输入:串w和文法g的分析表m。输出:如果w属于l(g),则输出w的最左推导,否则报告错误。方法:开始时,#s在分析栈中,其中s是文法的开始符号,在栈顶;令指针ip指向w#的第一个符号; 主要数据结构描述 char termin50; /*终结符号*/ char non_ter50; /*非终结符号
24、*/ char v50; /*所有符号*/ char left50; /*左部*/ char right5050; /*右部*/ int m2020; /*二维数组存储分析表*/ 栈t用来存放产生式的右边 str数组存放要分析的句子串 可参考的c语言源程序v/*ll(1)分析法源程序,只能在vc+中运行*/#include#include#include#includechar a20;/*分析栈*/char b20;/*剩余串*/char v120=i,+,*,(,),#;/*终结符*/char v220=e,g,t,s,f;/*非终结符 */int j=0,b=0,top=0,l;/*l为
25、输入串长度 */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(a=0;a=top+1;a+) printf(%c,aa); printf(tt);/*print*/void print1()/*输出剩余串*/ int j; for(j=0;jb;j+)/
26、*输出对齐符*/ printf( ); for(j=b;j=l;j+) printf(%c,bj); printf(ttt);/*print1*/void main() int m,n,k=0,flag=0,finish=0; char ch,x; type cha;/*用来接受cmn*/ /*把文法产生式赋值结构体*/ e.origin=e; strcpy(e.array,tg); e.length=2; t.origin=t; strcpy(t.array,fs); t.length=2; g.origin=g; strcpy(g.array,+tg); g.length=3; g1.or
27、igin=g; g1.array0=; g1.length=1; s.origin=s; strcpy(s.array,*fs); s.length=3; s1.origin=s; s1.array0=; s1.length=1; f.origin=f; strcpy(f.array,(e); f.length=3; f1.origin=f; f1.array0=i; f1.length=1; for(m=0;m=4;m+)/*初始化分析表*/ for(n=0;n=5;n+) cmn.origin=n;/*全部赋为空*/ /*填充分析表*/ c00=e;c03=e; c11=g;c14=g1;
28、c15=g1; c20=t;c23=t; c31=s1;c32=s;c34=c35=s1; c40=f1;c43=f;printf(提示:本程序只能对由i,+,*,(,)构成的以#结束的字符串进行分析,n); printf(请输入要分析的字符串:); do/*读入分析串*/ scanf(%c,&ch); if (ch!=i) &(ch!=+) &(ch!=*)&(ch!=()&(ch!=)&(ch!=#) printf(输入串中有非法字符n); exit(1); bj=ch; j+; while(ch!=#); l=j;/*分析串长度*/ ch=b0;/*当前分析字符*/ atop=#; a+
29、top=e;/*#,e进栈*/ printf(步骤tt分析栈 tt剩余字符 tt所用产生式 n); do x=atop-;/*x为当前栈顶字符*/ printf(%d,k+);printf(tt); for(j=0;j=5;j+)/*判断是否为终结符*/ if(x=v1j) flag=1; break; if(flag=1)/*如果是终结符*/ if(x=#) finish=1;/*结束标记*/ printf(acc!n);/*接受 */ getchar(); getchar(); exit(1); /*if*/ if(x=ch) print(); print1(); printf(%c匹配n
30、,ch); ch=b+b;/*下一个输入字符*/ flag=0;/*恢复标记*/ /*if*/ else/*出错处理*/ print(); print1(); printf(%c出错n,ch);/*输出出错终结符*/exit(1); /*else*/ /*if*/ else/*非终结符处理*/ for(j=0;j=4;j+) if(x=v2j) m=j;/*行号*/ break; for(j=0;j,cha.origin);/*输出产生式*/for(j=0;jcha.length;j+)printf(%c,cha.arrayj); printf(n); for(j=(cha.length-1);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*/ 运行结果(略)能力扩展实验完成达到实习目的之后,若尚有余力者,可进行如下能力扩展的训练: (1)对输入文法,它能判断是否为ll(1)文法,若是,则转(2);否则报错并终止
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年江苏省丹阳市高二生物下册期末考试模拟考试卷附答案【达标题】
- 2025年湖南省耒阳市高考历史试卷【考点提分】附答案
- 2025年四川省西昌市高二历史上册期末考试模拟卷(典型题)附答案
- 2025年湖北省宜都市高二生物上册期末考试考试卷及参考答案【A卷】
- 2025年湖北省当阳市高考历史真题及参考答案【黄金题型】
- 2025年江西省瑞昌市高二生物下册期末考试模拟卷【预热题】附答案
- 2026年吉林省舒兰市高二生物下册期末考试模拟试卷附完整答案(有一套)
- 2026年贵州省清镇市高二历史下册期末考试测试卷及参考答案(A卷)
- 2025年山西省霍州市高二历史上册期末考试试卷重点附答案
- 2025年广东省南雄市高二生物上册期末考试考试卷附完整答案【典优】
- 《药物临床试验质量管理规范(GCP)》试题附答案
- 2026山西晋中介休市同城供热有限公司招聘职位表考试参考题库及答案解析
- 河南省郑州市实验中学2026-2027学年高二上学期第一次月考物理试卷
- 2026年高考广西卷生物高考真题(含解析)
- 2026年安徽合肥单招考试题库
- 辽宁石化职业技术学院单招职业技能考试题库及答案
- 2026-2027学年四年级上册数学单元全真模拟培优卷(人教版)第4单元 加法模型和乘法模型
- 2026年全国职业病诊断医师培训职业性化学中毒复习题及答案
- 帕金森病深部脑刺激(DBS)手术
- 平面设计师招聘笔试题及解答(某大型国企)2025年
- 2026年温州市房地产行业分析报告及未来发展趋势报告
评论
0/150
提交评论