C语言语法分析器

上传人:小** 文档编号:112050851 上传时间:2022-06-22 格式:DOC 页数:29 大小:440KB
收藏 版权申诉 举报 下载
C语言语法分析器_第1页
第1页 / 共29页
C语言语法分析器_第2页
第2页 / 共29页
C语言语法分析器_第3页
第3页 / 共29页
资源描述:

《C语言语法分析器》由会员分享,可在线阅读,更多相关《C语言语法分析器(29页珍藏版)》请在装配图网上搜索。

1、郑州轻工业学院编译原理课程设计总结报告设计题目:词法分析器(语法分析器)学生姓名:系别:专业:班级:学号:指导教师:20013年6月2日一、设计题目3二、运行环境(软、硬件环境)3三、算法设计的思想3四、算法流程图5五、算法设计分析5六、源代码6七、运行结果11八、收获及体会122一)设计题目词法分析器二)运行环境VisualC+.6.0(三)算法设计的思想各种单词符号对应的种别码:单词符号种别码单词符号种别码begin117if2:=18then320while421do523letter(letter|digit)*10=24digitdigit*11=25+13(26一14)27*152

2、8/16#0算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。1.主程序示意图:主程序示意图如下;其中初值包括如下两个方面:1)关键字表的初值。关键字作为特殊标示符处理,把它们预先安排到一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如果能查到匹配的单词,则该单词为关键字,否则为一般的标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab6=“begin”,”if”,”then”,”while”,”do”,”end”;(2)程序需要用到的主要变量为syn,token和sum。2

3、扫描子程序的算法思想首先设置3个变量:(1)token用来存放构成单词符号的字符串;(2)sum用来存放整型单词(3)syn用来存放单词符号的种别码。(五)算法设计分析算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。其中初值包括如下两个方面:(一)关键字表的初值。关键字作为特殊标示符处理,把它们预先安排到一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如果能查到匹配的单词,则该单词为关键字,否则为一般的标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab6=“begin”,

4、”if”,”then”,”while”,”do”,”end”;(2)程序需要用到的主要变量为syn,token和sum。2扫描子程序的算法思想首先设置3个变量:(1)token用来存放构成单词符号的字符串;(2)sum用来存放整型单词(3)syn用来存放单词符号的种别码。(六)源代码#include#include#include#defineMAX150/词法分析表的最大容量#defineMAXBUF255/缓冲区的最大缓冲量charprogMAXBUF,tokenMAX;charch;intsyn,p,m,n,sum;1,1八11丿11H11char*rwtab6=begin,if,the

5、n,while,do,end;/词法分析程序/voidscaner()for(m=0;m=65&ch=122/*是字母字符*/)while(ch=65&ch=122|ch=48&ch=57)/*为字母字符或数字字符*/tokenm+=ch;ch=progp+;/读取下一个字符;tokenm+=0;p=p-1;syn=10;for(n=0;n=48&ch=57/*ch为数字字符*/)sum=sum*10+ch-0;ch=progp+;/读取下一个字符;p=p-1;/回退一个字符;syn=11;elseswitch(ch)case)syn=21;tokenm+=ch;elseif(ch=)syn=

6、22;tokenm+=ch;elsesyn=20;p=p-1;/回退一个字符;break;case:tokenm+=ch;ch=progp+;/卖取下一个字符;if(ch=)syn=24;/将=的中别码=syn;tokenm+=ch;elsesyn=23;p=p-1;/回退一个字符;break;case:tokenm+=ch;ch=progp+;/读取下一个字符;if(ch=)syn=18;tokenm+=ch;elsesyn=17;p=p-1;/回退一个字符;break;case+:syn=13;token0=ch;break;case-:syn=14;token0=ch;break;cas

7、e*:syn=15;token0=ch;break;case/:syn=16;token0=ch;break;case=:syn=25;token0=ch;break;case;:syn=26;token0=ch;break;case(:syn=27;token0=ch;break;case):syn=28;token0=ch;break;case#:syn=0;token0=ch;break;default:syn=-1;break;/主函数/voidmain()charA;cout*endl;loop:p=0;cout*endl;printf(pleaseinputstring(以#结束)

8、:n);doscanf(%c,&ch);progp+=ch;/输入源程序字符串,送到缓冲区progp+中;while(ch!=#);p=0;doscaner();switch(syn)casell:cout(syn,sum)endl;/输出(数的二元组);break;case-1:couterrorA;switch(A)caseS:gotoloop;default:cout*endl;coutThankyou!ByeBye!endl;cout*endl;break;七)运行结果分析c:Cty,xingCl,shiCl,woCW,ii请确定是否继续使用该程序泠为继续;其它为退出;:是否继续出pl

9、easeinputstring以越三咅皋.幣:x:=22;ifx0thenx;-=!i*x10+4Jend#ewavC1rbeginra亠儿fC18,;=C11,5C直亦*Cl,xC14,-C11,1C13,+C11,4C26,;C6,endCH,ttp5-.h:ih:-Micr&Eof.E:tC.VIlociuTientEan.r瑞建文不立袒吐H.hjihjihjihjihjihhhhhhhhhhhhhhjocjocjocjocjocjocKHK.K.请确定是否继续使用该程序消为继续;其它为退出:耀否继续一八)收获及体会为期一周的编译原理课程设计结束了,我们这次的任务是做一个编译器。这次课程

10、设计我做的是用C+编写词法分析器,编译程序是在单词的级别上来分析和翻译源程序的,因此词法分析是编译的基础。通过此次实验,我基本上了解了词法分析器的工作原理和功能以及实现方法。进一步学习了C语言的知识。此次实验,遇到的最大的一个问题就是用了C+语言里的cin输入字符串,结果空格符号直接给预处理掉了,导致开始的关键字与字母连接时会不识别,最后通过查阅,终于找到了这个问题的所在,最后通过C语言里的Scanf函数来输入,就解决了这个问题。总而言之,本程序实现了所要求的全部功能。美中不足的是程序中没有运用文件,对文件的掌握不是很到位,相信经过以后的程序训练,会熟练的运用文件来编程。13一、设计题目14二

11、、运行环境(软、硬件环境)14三、算法设计的思想14四、算法流程图15五、算法设计分析16六、源代码17七、运行结果26八、收获及体会27一)设计题目语法分析器二)运行环境VisualC+.6.0(三)算法设计的思想利用C语言编制递归下降分析程序,并对简单语言进行语法分析。待分析的简单语言得语法:ETE+TIE-TITTTT*FIT/FIFFT(E)Ii输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“Accept!RightExpression!,否则输出“Error。(四)算法的流程图161-J-圏L.P17(五) 算法设计分析语法分析:a) JE=E+T=E+T*F=

12、E+T*(E)即有E=E+T*(E)存在左递归。用直接改写法消除左递归,得到如下:E弓TEE弓+TE|TE|T弓FTT弓*FT|/FT|F9(E)Iib) 对于以上改进的方法。可得:对于E:FIRST(E)=FIRST(+TE)UFIRST(-TE)U&=+,e对于T:FIRST(T)=FIRST(*FT)UFIRST(/FT)U&=*,/,&而且:FIRST(E)=FIRST(T)=FIRST(F)=FIRST(E)UFIRST(i)=(,i由此我们容易得出各非终结符的FOLLOW集合如下:FOLLOW(E)=),#FOLLOW(E)=FOLLOW(E)=),#FOLLOW(T)=FIRST

13、(E)eUFOLLOW(E)=+,),#FOLLOW(T)=FOLLOW(T)=+,),#FOLLOW(F)=FIRST(T)&UFOLLOW(T)=*,/,),#由以上FOLLOW集可以我们可以得出SELECT集如下:对ESELECT(ETTE)=FIRST(TE)=FIRST(T)=(,i对ESELECT(ET+TE)=+SELECT(ET-TE)=-SELECT(ET)=,),#对TSELECT(TTFT)=(,i对TSELECT(TT*FT)=*SELECT(TT/FT)=/SELECT(TT)=,+,-,),#对FSELECT(FT(E)=(SELECT(FTi)=iSELECT(E

14、T+TE)nSELECT(ET-TE)nSELECT(ETs)=SELECT(TT*FT)nSELECT(TT/FT)nSELECT(TTs)=SELECT(FT(E)nSELECT(FTi)=由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。因此,转化后的文法可以用递归下降分析法作语法分析。(六) 源代码#includestdio.h#includedos.h#include#includestring.hchara50,b50,d200,e10;charch;intn1,i1=0,flag=1,n=5;inttotal=0;intE();intE1();in

15、tT();intG();intS();intF();voidinput();voidinput1();voidoutput();voidmain()/*递归分析*/intf,p,j=0;charx;d0=E;d1=;d2=;d3=T;d4=G;d5=#;printf(Pleaseinputcharacterstring(lengthTGt,total);total+;flag=1;input();input1();f=T();if(f=0)return(0);t=G();if(t=0)return(0);elsereturn(1);intE()intf,t;printf(%dtE-TGt,to

16、tal);total+;e0=E;e1=;e2=;e3=T;e4=G;e5=#;output();flag=1;input();input1();f=T();if(f=0)return(0);t=G();if(t=0)return(0);elsereturn(1);intT()intf,t;printf(%dtT-FSt,total);total+;e0=T;e1=;e2=;e3=F;e4=S;e5=#;output();flag=1;input();input1();f=F();if(f=0)return(0);t=S();if(t=0)return(0);elsereturn(1);int

17、G()intf;if(ch=+)bi1=ch;printf(%dtG-+TGt,total);total+;e0=G;e1=;e2=;e3=+;e4=T;e5=G;e6=#;output();flag=0;input();input1();ch=a+i1;f=T();if(f=0)return(0);G();return(1);printf(%dtG飞t,total);total+;e0=G;el=;e2=;e3=;e4=#;output();flag=1;input();input1();return(1);intS()intf,t;if(ch=*)bi1=ch;printf(%dtS-*F

18、St,total);total+;e0=S;e1=;e2=;e3=*;e4=F;e5=S;e6=#;output();flag=0;input();input1();ch=a+i1;f=F();if(f=0)return(0);t=S();if(t=0)return(0);elsereturn(1);printf(%dtS飞t,total);total+;e0=S;el=;e2=;e3=;e4=#;output();flag=1;ai1=ch;input();input1();return(1);intF()intf;if(ch=()bi1=ch;printf(%dtF-(E)t,total)

19、;total+;e0=F;e1=;e2=;e3=(;e4=E;e5=);e6=#;output();flag=0;input();input1();ch=a+i1;f=E();if(f=0)return(0);if(ch=)bi1=ch;printf(%dtF-(E)t,total);total+;flag=0;input();input1();ch=a+i1;elseprintf(nErrorn);return(0);elseif(ch=i)bi1=ch;printf(%dtF-it,total);total+;e0=F;e1=;e2=;e3=i;e4=#;output();flag=0;i

20、nput();input1();ch=a+i1;elseprintf(nErrorn);return(0);return(1);voidinput()25intj=0;/*输出分析串*/*输出分析字符*/for(;j=i1-flag;j+)printf(%c,bj);printf(tt);printf(%ctt,ch);voidinput1()intj;for(j=i1+1-flag;j;dn+2=#;n=n+2;i=n;i=i-2;while(di!=&i!=0)i=i-1;while(di!=e0)i=i+1;q=i;m=q;k=q;while(dm!=)m=m-1;m=m+1;while

21、(m!=q)dn=dm;m=m+1;n=n+1;dn=#;for(j=3;ej!=#;j+)dn=ej;n=n+1;k=k+1;while(dk!=)dn=dk;n=n+1;k=k+1;dn=#;(七) 运行结果分析27g*E:codeyufakDebuga.exe*28八)收获及体会通过这次实验,我对语法分析有了更深刻的了解,对它的形成有了更清楚得认识。本次实验我主要是基于试验资料上的程序流程图和程序框架完成的。由一个简单一些的产生式得出程序的各个分函数。此次所编写的语法分析程序是递归下降语法分析分析器,通过分析文法产生式得FFIRST、FOLLOW和SELECT集合来判断LL(1)方法,然后用递归下降语法分析法分析LL(1)方法得基本递归流,用C语言编程实现分析器。本次所写的语法分析器过于简单,相信以后会再接再厉写出更复杂,更好的分析器来。本次试验让我有理论联系实际的机会,有助于巩固所学的相关知识,让我对变成产生了很浓厚的兴趣,让自己的编程能力提高了一个层次,更发现了一些自己的不足之处。我会认真的学习以克服在实验过程中发现的缺点及错误。29

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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