




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学号 E10714103 专业 计算机科学与技术 姓名 万学进实验日期2010-6-8 教师签字 成绩实 验 报 告【实验名称】 SLR(1)语法分析【实验目的】构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。【实验内容】对下列文法,用LR(1)分析法对任意输入的符号串进行分析: (1)S->E(2)E->E+T(3)E->T(4)T->T*F(5)T->F(6)F->(E)(7)F->i【设计思想】(1)总控程序,也可以称为驱动程序。对所有的LR
2、分析器总控程序都是相同的。(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。分析器的动作就是由栈顶状态和当前输入符号所决定。u LR分析器由三个部分组成:u 其中:SP为栈指针,Si为状态栈,Xi为文法符号栈。状态转换表用GOTOi,X=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j,X为终结符或非终结符。u ACTIONi,a规定了栈顶状态为i时遇到输入符号a应执行。动作有
3、四种可能:(1)移进: actioni,a= Sj:状态j移入到状态栈,把a移入到文法符号栈,其中i,j表示状态号。(2)归约: actioni,a=rk:当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A- B的产生式,若B的长度为R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,j=GOTOi,A移进状态栈,其中i为修改指针后的栈顶状态。(3)接受acc: 当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是'#',则为分析成功。(4)报错:当遇到状态栈顶为某一状态下出现不该遇到的
4、文法符号时,则报错,说明输入端不是该文法能接受的符号串。【实验要求】1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。2、如果遇到错误的表达式,应输出错误提示信息。 3、程序输入/输出实例: 输入一以#结束的符号串(包括+*/()i#):在此位置输入符号串 输出过程如下:步骤 状态栈 符号栈 剩余输入串 动 作 1 0 # i+i*i# 移进 【流程图】【源代码】#include<stdio.h>#include<stdlib.h>int Action126=105,0,0,104,0,0,0,106,0,0,0,-1,0,52,107,0,52
5、,52,0,54,54,0,54,54,105,0,0,104,0,0,0,56,56,0,56,56,105,0,0,104,0,0,105,0,0,104,0,0,0,106,0,0,111,0,0,51,107,0,51,51,0,53,53,0,53,53,0,55,55,0,55,55;int Goto123=1,2,3,0,0,0,0,0,0,0,0,0,8,2,3,0,0,0,0,9,3,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0;char Grammar2010='0'char VT10,VN10;char AVT6='i',&
6、#39;+','*','(',')','#'char GVN3='E','T','F'int vnNum,vtNum,stateNum=12;int VNum10;int grammarNum;typedef structchar *base;char *top;SymbolStack;typedef structint *base;int *top;StateStack;StateStack state;SymbolStack symbol;int ScanGrammar(
7、)FILE *fp=fopen("SLR文法.txt","r"); FILE *tp;char singleChar,nextChar;int i=0,j=0,k,count;while(!feof(fp)fscanf(fp,"%c",&singleChar);if(singleChar='?')Grammarij='0'break;if(singleChar='n')Grammarij='0'i+;j=0;continue;if(singleChar='
8、-')tp=fp;fscanf(tp,"%c",&nextChar);if(nextChar='>')fp=tp;continue;if(singleChar='|')Grammari+10=Grammari0;Grammarij='0' i+;j=1;continue;Grammarij=singleChar;if(singleChar>='A'&&singleChar<='Z')count=0;while(VNcount!=singleCha
9、r&&VNcount!='0')count+;if(VNcount='0')vnNum=count+1;if(singleChar='S')j+;continue;VNcount=singleChar;vnNum=count+1;else count=0;while(VTcount!=singleChar&&VTcount!='0')count+;if(VTcount='0')VTcount=singleChar;vtNum=count+1;j+;printf("输入的文法
10、:n");for(k=0;k<=i;k+)j=0;while(Grammarkj!='0')if(j=1)printf("->");printf("%c",Grammarkj);j+; printf("n");count=0;printf("VT:");while(VTcount!='0')printf("%3c",VTcount); count+;VTcount='#'vtNum=count+1;printf("%
11、3c",VTcount);printf("nVN:");count=0;while(VNcount!='0')printf("%3c",VNcount);count+;printf("n");/printf("n%d %dn",vtNum,vnNum);fclose(fp);grammarNum=i+1; return i;int vNumCount()int i,j;for(i=0;i<grammarNum;i+)j=1;while(Grammarij!='0')j
12、+;VNumi=j;/printf("%3d",VNumi);printf("n");return 0;void InitStack()state.base=(int *)malloc(100*sizeof(int);if(!state.base)exit(1);state.top=state.base;*state.top=0;symbol.base=(char *)malloc(100*sizeof(char);if(!symbol.base)exit(1);symbol.top=symbol.base;*symbol.top='#'
13、int Judge(int stateTop,char inputChar)int i,j;for(i=0;i<stateNum;i+)if(stateTop=i)break;for(j=0;j<vtNum;j+)if(inputChar=AVTj)break;return Actionij;int GetGoto(int stateTop,char inputChar)int i,j;for(i=0;i<stateNum;i+)if(stateTop=i)break;for(j=0;j<vnNum;j+)if(inputChar=GVNj)break;return G
14、otoij;int print(int count,int i,char Input,int action,int gt,int sign)int *p=state.base,stateNum;int j,jj;char *q=symbol.base,symbolNum;printf("%dt",count);while(p!=state.top+1)stateNum=*p;printf("%d",stateNum);p+;printf("t");while(q!=symbol.top+1)symbolNum=*q;printf(&q
15、uot;%c",symbolNum);q+;printf("t");j=i;jj=0;while(jj<j)printf(" ");jj+;while(Inputj!='0')printf("%c",Inputj);j+;printf("t");if(sign=1)printf("tS%dt%dn",action,gt);if(sign=2)printf("tr%dt%dn",action,gt);if(sign=3)printf("
16、tacct%dn",gt);if(sign=0)printf("t0t0n");return 0;int Pop(int action)int *p,stateNum,ssValue,i;state.top-;p=state.top;stateNum=*p;i=VNumaction-1;while(i!=0)symbol.top-;i-;symbol.top+;*symbol.top=Grammaraction0;ssValue=GetGoto(stateNum,Grammaraction0);if(ssValue=0)return ssValue;state.t
17、op+;*state.top=ssValue;return ssValue;int Reduction()char Input20;int i=0,count=1;int ssValue,action;int stateTop,gt;int sign=-1;/移进1,规约2,接受3scanf("%s",&Input); while(Inputi!='0')if(Inputi>='A'&&Inputi<='Z')printf("输入的不是有效的表达式!");return 0
18、;i+;i=0;printf("步骤t状态栈t符号栈t输入串ttACTIONtGOTOn");while(Inputi!='0')if(count=1)print(count,i,Input,0,0,0);count+;stateTop=*state.top;ssValue=Judge(stateTop,Inputi);if(ssValue=0)state.top-;if(*symbol.top='#')printf("规约出错!");return 0;continue;if(ssValue=-1)sign=3;print(count,i,Input,ssValue,0,sign);count+;return 1;if(ssValue>=100)sign=1;action=ssValue-100;state.top+;*state.top=ac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CAQI 210-2021果蔬清洗装置
- T/CAPE 10001-2017设备管理体系要求
- 摆摊卖菜面试题及答案
- 优酷土豆java面试题及答案
- 法务人员考试题及答案
- 德州保姆面试题及答案
- 小学创意活动策划方案模板
- 高碑店代写合同范本
- 商业设计项目合作协议书
- 公司辞退劳动合同范本
- 鼎捷T100-V1.0-料件管理用户手册-简体
- 人物速写入门教程
- GB/T 5174-2004表面活性剂洗涤剂阳离子活性物含量的测定
- GB/T 17737.1-2013同轴通信电缆第1部分:总规范总则、定义和要求
- 广州 国际健康产业城发展规划方案
- 考研考博-英语-内蒙古工业大学考试押题卷含答案详解4
- 医院二级库管理制度(大全)
- 华为内部控制PPT培训课件
- 雨季监理实施细则
- 分层审核检查表LPA全套案例
- 三标一体文件编写指南
评论
0/150
提交评论