语法分析实验 语法分析(LR).doc_第1页
语法分析实验 语法分析(LR).doc_第2页
语法分析实验 语法分析(LR).doc_第3页
语法分析实验 语法分析(LR).doc_第4页
语法分析实验 语法分析(LR).doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实 验 报 告 课程名称 编译原理 实验名称 语法分析(LR) 班 级 计科1203 学 号 201207010321 姓 名 马万里 指导教师 黄 全 舟 实验日期 2015.5.21 一、实验目的 构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。二、实验原理(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作(ACTION)和状态转(GOTO)表两个部分,它们都可用二维数组示。(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后栈。分析器的 动 作就是由栈顶状态和当前输入符号所决定。 LR分析器由三个部分组成:其中:SP为栈指针,Si为状态栈,Xi为文法符号栈。状态转换表用GOTOi,X=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j,X为终结符或非终结符。ACTIONi,a规定了栈顶状态为i时遇到输入符号a应执行。3、 主要仪器设备 Pc机一台(装有vs2012)四、主要代码及其说明#include #include #include #include using namespace std;#define N 10char *Action4= /此处三维也可以S3, S4, ERROR,ERROR,ERROR,ERROR,ERROR,acc,ERROR,ERROR,S5, R2,ERROR,ERROR,R3, R3,ERROR,ERROR,R4, R4,S3, S4, ERROR,ERROR, ERROR,ERROR,ERROR,R1;Int GoTo2=1,2,0,0,0,0,0,0,0,0,6,2,0,0;char *GL=L-E,L,L-E,E-a,E-b ;int _Push(vector &State,vector &InChar,int a,char b)State.push_back(a);InChar.push_back(b);return a;void _Pop(vector &State,vector &InChar,int cout)while(cout)State.pop_back();InChar.pop_back();cout-;void PrinStack(vector State,vector InChar)/状态栈 和栈中符号输出vector :iterator iter_s =State.begin();vector :iterator iter_i=InChar.begin();for(;iter_s !=State.end();iter_s+)cout*iter_s;printf(t);for(;iter_i !=InChar.end();iter_i+)cout) m=1;if(m0) m+;p+;return (m-2);void menu()printf(步骤t状态t栈中符号t余留符号t分析动作t下一状态);void main()cout请输入符号串(以#标记结束):;vector State; /状态栈vector InChar; /栈中的符号State.push_back(0);InChar.push_back(#); char *InCh; /输入的字符串InCh = (char *)malloc(sizeof(char)*N);gets(InCh); printf(n*符号串%s的LR分析过程*nn,InCh);menu();int ToS=0,InS=0,count=0; while(strncmp(ActionToSInS,acc,3)count+; /步骤序号if(!strncmp(ActionToSInS,ERROR,5)printf(error);break;else if(!strncmp(ActionToSInS,S,1)int temp;printf(n%dt,count);PrinStack(State,InChar);switch(ActionToSInS1)case 1: temp= _Push(State,InChar,1,*InCh); break;case 2: temp= _Push(State,InChar,2,*InCh); break;case 3: temp= _Push(State,InChar,3,*InCh); break;case 4: temp= _Push(State,InChar,4,*InCh); break;case 5: temp= _Push(State,InChar,5,*InCh); break;printInCh(InCh); printAanly(S,atoi(&ActionToSInS1);printNextState(S,ActionToSInS1);ToS=temp; InCh+;if(*InCh=a)InS=0;if(*InCh=b)InS=1;if(*InCh=,)InS=2;if(*InCh=#)InS=3;else if(!strncmp(ActionToSInS,R,1)int itemp;int ntemp;int temp;char ctemp;printf(n%dt,count);PrinStack(State,InChar);int f=atoi(&ActionToSInS1)-1;itemp =Lcount(GLf); /右部的符号个数_Pop(State,InChar,itemp); /删除两栈中的tem个字符ctemp=*GLf; /获取当前文法的左边字符 if(ctemp=L) temp=0; if(ctemp=E) temp =1; ToS=State.back(); ntemp= GoToToStemp; /获取当前的下一状态_Push(State,InChar,ntemp,ctemp);printInCh(InCh);printAanly(R,f+1);printf(GOTO%d,%c=%d,ToS,ctemp,ntemp);ToS=ntemp;count+;/处理当acc时 的情况if(!strncmp(ActionToSInS,acc,3)printf(n%dt,count);PrinStack(State,InChar); printInCh(InCh);printf(accn); 5、 程序测试结果输入:a,b,a#

温馨提示

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

评论

0/150

提交评论