中南大学编译原理实验报告.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《中南大学编译原理实验报告.pdf》由会员分享,可在线阅读,更多相关《中南大学编译原理实验报告.pdf(75页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中南大学编译原理实验报告班级:计科1205姓名:赵越学号:0909122209实验一词法分析程序设计与实现一、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用-种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。二、实验内容自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“E r r o r”,然后跳过错
2、误部分继续显示)三、实验要求:1 .对单词的构词规则有明确的定义;2 .编写的分析程序能够正确识别源程序中的单词符号;3.识别出的单词以种别码,值 的形式保存在符号表中,正确设计和维护符号表;4 .对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;四、实验步骤1 .定义目标语言的可用符号表和构词规则;2 .依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3 .对正确的单词,按照它的种别以种别码,值 的形式保存在符号表中;4 .对不正确的单词,做出错误处理。五、设计思路和实现过程本实验是词法分析器,我是用的是M F C实现的,我
3、的设计思路就是按照书上提示的算法,先将儿个词法分析器所需的基本函数用C+的形式实现,然后使用循环语句读入输入串的每一个字符,然后用i f e l s e语句实现,具体判断方式如下:1、如果读入的是字母,那么继续读入,知道读入的字符不是字母或者数字为止,对照标识符表,如果是标识符,则显示该串及对应标识符;如果不是,则显示该串和“$I D ;2、如果读入的是数字,则继续读入,知道不是数字为止,并显示该串和“$I N T”;3、如果读入的是“=则分别输出该串和 A S S I G N ,“$P L U S ,$S E M I C O L O N ,$L P A R”,$R P A R ,$L B R
4、 A C E ,$R B R A C E;4、如果读入的是“*,那么继续读入,如果下一个是“*,则输出该串和$P O W E R”;否则输出该串和“$S T A R”,并将指针回退;5、如果独到输入串末尾,则退出。六、错误处理创建一个键,如果读出的字符不属于以上任何情况,则把此键置为真,通知程序退出循环,从而实现对错误的处理。七、关键代码1、v o i d CWo r d an al y s i s Dl g:Get Ch ar()(ch=m _i n p u t.Get At(p o i n t er);p o i n t er+;2、v o i d CWo r d _an al y s i
5、 s Dl g:Co n cat O(s t r To k en+=ch;)3、v o i d CWo r d _an al y s i s Dl g:Get BC()(w h i l e(ch=,)Get Ch ar ();4、v o i d CWo r d _an al y s i s Dl g:Ret r act()p o i n t er一;ch二 ;5、i n t CWo r d an al y s i s Dl g:Res er v e()/i f(s t r cm p(s t r To k en,)i n t i;fo r(i=l;i =,a&ch=A&ch=O&ch=9)r e
6、t u r n t r u e;el s er et u r n fal s e;8、v o i d CWo r d _an al y s i s Dl g:0n An al y s i s()(/TODO:Ad d y o u r co n t r o l n o t i fi cat i o n h an d l er co d e h er em _l i s t.Del et eAl l I t em s();p o i n t er=0;Up d at eDat aO;m _i n p u t+=,0;w h i l e(p o i n t er xx.*/void AddFi rs
7、t(i n t U,in t n Ch);/*加入 f i rst 集*/bool HaveEmpty(in t n Vn);/*判断 f i rst 集中是否有空(T)*/void Fol Iow(in t V);/*计算 fol low 集*/void AddFol Iow(i n t V,in t n Ch,i n t kin d);/*力 口 入 fol low 集,kin d=0 表加入 fol low 集,kin d=1 加入 f i rst 集*/void ShowCo I I ect(struct co I I ectNode*col lect);/*输出 f i rst 或
8、fol low 集*/void Fi rstFoI Iow();/*计算 f i rst 和 fol Iow*/void CreateAT();/*构造预测分析表*/void ShowAT();/*输出分析表*/void Iden tify(char*st);/*主控程序,为操作方便*/*分析过程显示操作为本行变换所用,与教程的显示方式不同*/void In itStackO;/*初始化栈及符号串*/vo i d ShowStack();/*显示符号栈中内容*/void Pop();/*栈顶出栈*/void Push(in t r);/*使用产生式入栈操作*/#in clude LL1.hvo
9、 i d ma i n (vo i d)char todo,ch;I n i t();In putVn ();I n putVt();In putPO;getchar();Fi rstFol low();pr 所得 fi rst 集为:);ShowCoI Iect(fi rst);pr in tf(所得 follow 集为:“);ShowCoI Iect(foI Iow);CreateAT();ShowAT();todo 二,y,;whi Ie(*y*=todo)(prin tf(n是否继续进行句型分析?(y/n):);todo 二 getchar();whileCy !二 todo&n !二
10、 todo)(prin tfrn(y/n)?);todo=getchar();Jif(y =todo)in t i;In itStack();prin tf(请输入符号串(以#结 束):);ch=getchar();i =0;while,#!=ch&i MaxStLen gth)(if(!=ch&n !=ch)(sti +=ch;)ch 二 getchar();)if,#,=ch&i MaxStLen gth)(sti=ch;Iden tify(st);)e I sepr in tf(输入出错!n );)1getchar();)void In it()(in t i,j;vn Num=0;vt
11、Num=0;PNum=0;for(i=0;i =MaxVn Num;i+)Vn i二,(T;for(i=0;i =MaxVtNum;i+)Vti二,(T;for(i=0;i MaxRuleNum;i+)(Pi.ICursor 二 NULL;Pi,rHead=NULL;Pi.rLen gth=0;)PNum=0;for(i=0;i =MaxPLen gth;i+)bufferi=0;for(i=0;i MaxVn Num;i+)(firsti=NULL;followi=NULL;)for(i =0;i =MaxVn Num;i+)(for(j=0;j=MaxVn Num+1;j+)an alys
12、eTablei j=-1;)/)*返回Vn 在 Vn 表中的位置+100、Vt在 Vt表中的位置,7表示未找到*/i n t In dexCh(char ch)(i n t n;n =0;/*i s Vn?*/whi le(ch!=Vn n&0 !=Vn n)n+;iff Of!=Vn n)return 100+n;n =0;/*is Vt?*/whi le(ch!=Vtn&0 !=Vtn)n+;if(0 !=Vtn)return n;return -1;)/*输出Vn 或 Vt的内容*/void ShowChArray(char*collect)in t k=0;while(0 !=col
13、lectk)(pr i n tf C%c”,co I Iectk+);)pr in tf Cn,z);)/*输入非终结符*/vo i d I n putVn ()i n t i n Err=1;i n t n,k;char ch;whiIe(i n Err)(pr in tf(n 请输入所有的非终结符,注意:);pr in tf(请将开始符放在第一位,并以#号结束:n );ch 二,;n =0;/*初始化数组*/whiIe(n MaxVn Num)(Vn n+=0;)n =0;whi Ie(*#*!=ch)&(n MaxVn Num)(ifC !=ch&n !=ch&-1=In dexCh(c
14、h)(Vn n+=ch;vn Num+;ch=getchar();)Vn n=,铲;/*以“#”标志结束用于判断长度是否合法*/k=n;/*k用于记录n以便改Vn n=0*/ifC#!=ch)(if(!=(ch=getchar()(whiIe C#!=(ch=getchar 0)prin tf(n 符号数目超过限制!n );i n Err=1;con t i n ue;)/*正确性确认,正确则,执行下下面,否则重新输入*/Vn k=0;ShowChArray(Vn);ch=,;while(y !=ch&n !=ch)(if C n !=ch)(pr in tf(“输入正确确认?(y/n):);
15、)scan f(%c”,&ch);)if C n =ch)(pr i n tf(录入错误重新输入!n );i n Err=1;)e I se(i n Err=0;)/*输入终结符*/vo i d I n putVt()(in t in Err=1;i n t n,k;char ch;while(in Err)prin tf(n请输入所有的终结符,注意:”);pri n tf(以#号结束:n );ch=,;n =0;/*初始化数组*/whiIe(n MaxVtNum)(Vtn+=0;)n =0;whiIe(C#!=ch)&(n MaxVtNum)(if(,!=ch&n !=ch&-1=In de
16、xCh(ch)(Vtn+=ch;vtNum+;)ch=getchar();)Vtn /*以“#”标志结束*/k=n;/*k用于记录n以便改Vtn=。*/if(#!=ch)(if(#!=(ch=getchar()(whiIeC#!=(ch=getchar()pri n tf(n符号数目超过限制!n );in Err=1;con tin ue;)/*正确性确认,正确则,执行下下面,否则重新输入*/Vtk=0;ShowChArray(Vt);ch=;whi Ie(y !=ch&n !=ch)ifC n !=ch)(pr in tf(输入正确确认?(y/n):);scan f(%c”,&ch);ifC
17、 n =ch)(prin tf(录入错误重新输入!n );i n Err=1;)else(i n Err=0;)/*产生式输入*/void In putPO(char ch;in t i =0,n,n um;prin tf(请输入文法产生式的个数:”);scan f(,z%d,z,&n um);PNum=n um;getchar();/*消除回车符*/pri n tf(n 请输入文法的%d j 产生式,并以回车分隔每个产生式:,n um);prin tf C V7);wh i Ie(i n um)(pr in tf(第%d 个:,i);/*初始化*/for(n =0;n MaxPLen gth
18、;n+)buffern =0;/*输入产生式串*/ch 二,;n =0;while,n !=(ch=getchar 0)&n rCursor=In dexCh(buffer3);pt-n ext=NULL;Pi.rHead=pt;n =4;whileC O !=buffer n)(qt=(pRNode*)ma I Ioc(s i zeof(pRNode);qt-rCursor=In dexCh(buffern);qt-n ext=NULL;pt-n ext=qt;pt 二 qt;n+;)Pi.rLen gth=n -3;i+;/*调试时使用*/)elseprin tf(输入符号含非法在成分,请
19、重新输入!n);)/*判断产生式正确性*/bool CheckP(char*st)(in t n;if(100 In dexCh(st0)return false;ifC-!=st1)return false;if C !=St2)return false;for(n =3;0 !=st n ;n +)(if(-1=In dexCh(st n)return false;)return true;)/*=f i rst&f o I I ow=*/*计算 f i rst 集,U-xx.*/void Fi rst(in t U)in t i,j;for(i=0;i PNum;i+)if(Pi.ICu
20、rsor=U)(struct pRNode*pt;pt=Pi.rHead;J=0;whiIe(j pt-rCursor)(/*注:此处因编程出错,使空产生式时r len gth同样是1,故此处同样可处理空产生式*/AddFi rst(U,pt-rCursor);break;)e I se(i f(NULL=f i rstpt-rCursor-100)(F i rst(pt-rCursor);)AddF i rst(U,pt-rCursor);if(!HaveEmpty(pt-rCursor)(break;)e I se(pt=pt-n ext;)j+;)if(j=Pi.rLen gth)/*当
21、产生式右部都能推出空时*/AddFirst(U,-1);)/*加入first集*/vo i d AddF i rst(i n t U,i n t n Ch)/*当数值小于 100 时 n Ch 为 Vt*/*当处理非终结符时,AddFi rst不添加空项(T)*/struct col I ectNode*pt,*qt;i n t ch;/*用于处理Vn*/pt=NULL;qt=NULL;if(n Ch n Vt=n Ch)break;e I se(qt=pt;pt=pt-n ext;)if(NULL=pt)(pt=(struct collectNode*)ma I Ioc(s i zeof(s
22、truct col I ectNode);pt-n Vt=n Ch;pt-n ext=NULL;i f(NULL=firstU-100)firstU-100=pt;e I se(qt-n ext=pt;/*qt指向fi rst集的最后一个元素*/)pt=pt-n ext;)e I se(pt=firstn Ch-100;while(NULL!=pt)(ch=pt-n Vt;if(-1!=ch)AddFirst(U,ch);)pt=pt-n ext;/*判断first集中是否有空(7)*/boo I HaveEmpty(i n t n Vn)(if(n Vn n Vt)return true;p
23、t=pt-n ext;)return false;)/*计算fol low集,例:U-xVy,U-xV.(注:初始符必含#void Fol Iow(in t V)in t i ;struct pRNode*pt;if(100=V)/*当为初始符时*/AddFol low(V,-1,0);for(i=0;i rCursor!=V)/*注此不能处理:U-xVyVz 的情况*/pt=pt-n ext;if(NULL!=pt)(pt=pt-n ext;/*V 右侧的符号*/if(NULL=pt)/*当 V 后为空时V-xV,将左符的fol low集并入V 的 fol low集中*/if(NULL=fo
24、llowPi,ICursor-100&Pi.ICursor!=V)(Follow(Pi.ICursor);)AddFoI Iow(V,Pi.ICursor,0);)else/*不为空时V-xVy,(注意:y-,调用AddFol low加入Vt或 y 的 fi rst集*/while(NULL!=pt&HaveEmpty(pt-rCursor)AddFol low(V,pt-rCursor,1);/*y 的前缀中有空时,加如 first 集*/pt=pt-n ext;if(NULL=pt)/*当后面的字符可以推出空时*/(if(NULL=followPi.(Cursor-100&Pi.ICurs
25、or!=V)Follow(Pi.ICursor);)AddFollow(V,Pi.ICursor,0);)else/*发现不为空的字符时*/(AddFollow(V,pt-rCursor,1);)/*当数值小于100时n Ch为Vt*/*#m T表示,kin d用于区分是并入符号的first集,还是follow集kin d=0 表加入 fol low 集,kin d=1 加入 first 集*/void AddFollow(in t V,in t n Ch,in t kin d)struct col I ectNode*pt,*qt;in t ch;/*用于处理Vn*/pt=NULL;qt=N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 编译 原理 实验 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内