1 / 11
文档名称:

语法分析实验报告.doc

格式:doc   大小:327KB   页数:11页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

语法分析实验报告.doc

上传人:ttteee8 2019/10/18 文件大小:327 KB

下载得到文件列表

语法分析实验报告.doc

文档介绍

文档介绍::..《编译系统设计实践》实验项目二:语法分析指导老师: 陈晖组长:030902336组员:030902246030902335实验目的根据给出的文法编制LR(1)分析程序,以便对任意输入的符号串进行分析。木次实验的冃的主要是加深对LR(1)分析法的理解。二、 实验内容对已给语言文法,构造LR(1)分析表,编制语法分析程序,要求将错误信息输出到语法错误文件中,并输出分析句子的过程(显示栈的内容)。三、 程序设计与实现1•功能描述:根据给定的文法,由程序生成项集族和语法分析表,对输入的源程序进行词法分析,得到语法分析的输入串,经过语法分析后得到三个栈,它们分别是状态栈,字符栈,输入栈,从而分析出输入的源程序是否有语法错误。2・重要过程描述:1)本实验有两个输入文件:一个为源代码输入文件"",一个为文法的输入文件“",三个输出文件:一个为词法的输出和语法的输入文件"“”一个为语法分析结果的输出即栈的输出“?,o2)重要数据结构:typedefstructproduction{//产生式charsuf[25];//搜索符charrear[30]; 〃产生式后部charfront; 〃产生式头部unsignedpoint;〃小圆点的位置shortseq;Jprod;typedefstructstatement{〃状态iprodp[50];〃产生式intnum;//产生式数量}state;typedefstructcollection{/状态集statei[300];intnum;//状态个数}coll;structfstruct{//first集charstr[5O];//first符号串intnum;//first符号串字符个数boolblank;〃是否包含空符号Jfirstx;shortintanatab[300]3・程序流程图:(state&unclosure,intn)函数:功能:判断是否已包含某一产生式。在求闭包closing)函数屮对其进行调用;参数说明:unclosure还没有求闭包的状态;n表示第几个产生式。first(chartmp)函数:求各文法符号的first集,确定搜索符时使用到。在求闭包的函数中队其进行调用;参数说明:tmp为需要求first集的文法符号。sign()函数:功能:提取文法符号序列,将所有的文法符号+,$,都存放在一个一维数组中,该数组在输出分析表及语法分析中对栈进行处理时是需耍使用。reloadtoken()函数:功能:词法分析的结果。从文件屮读入字符到buff中,将得到的单词定义成相应的运算符、分隔符,关键字k,标识符i,实数f,,该文件为词法分析的输出,语法分析的输入。voiditems(coll&head)函数:功能:求LR(1)项目集族voidclosure(state&unclosure)函数:功能:求LR(1)项目集族的闭包。statemygoto(conststate&cur,intk,inttmp)函数:功能:填写分析表anatab[][],使用数字,空白用0,S移入为负数,「规约为止数,・接受。四、关键代码/*求LR⑴项冃集族*/voiditems(coll&head){inti,j,k;〃建立项集memset(&head,(),LENCOLL);〃初始化第一条增广文法s->S,$;[0].p[0].front='s';strcpy([()[O].rear,nSn);++;[O].num++;[0].p[0].suf[0]=,$,;〃对増广文法求闭包closure([OJ);statepnext;intfindi;for(i=0;i<;i++)for(j=0;j<strnum;j++)//strnum为文法符号个数{pnext=mygoto([i],i,j);if(==0){continue;}〃判谕pnext状态是否已经存在for(k=0,findi=0;k<;k+4-)if(memcmp(&pnext,&[k],LENSTATE)==0){anatab[i]fjl=k;findi=1;break;}if(findi==0){anatab[i][j]=;]=pnext;