1、实验五SLR语法分析器编译原理实验报告实验序号: 05实验项目名称: SLR语法分析器学号姓名专业、班实验地点指导教师实验时间一、实验目的及要求 利用SLR文法的原理,掌握非递归预测分析的编程方法。二、实验设备(环境)及要求 确定开发工具,如TC、VC、VC+、Delphi等;花一周时间熟悉开发工具。花一周时间确定被处理的语言的语法特点(初步确定,也可使用现成语言如Pascal、C等)。写好实验报告,编好程序。三、实验内容与步骤 利用c语言实现以下SLR文法的分析程序。 文法的开始符号为: E-E+TE-TT-T*FT-FF-(E)F-id实验步骤1、建立该文法的分析表;2、编程实现LR分析程
2、序。 四、实验结果与数据处理 1文法分析表:2.程序分析:实验源程序:#include #include int Action126= 105,0,0,104,0,0, 0,106,0,0,0,-1, 0,52,107,0,52,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,
3、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,+,*,(,),#; char GVN3=E,T,F; int vnNum,vtNum,stateNum=12; int VNum10; int grammarNum; typedef struct char *base; char *top; SymbolStack; typedef struct int *base; int *top; StateSta
4、ck; StateStack state; SymbolStack symbol; int ScanGrammar() 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=-) tp=fp; f
5、scanf(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!=singleChar&VNcount!=0) count+; if(VNcount=0) vnNum=count+1; if(singleChar=S) j+; continue; VNcoun
6、t=singleChar; vnNum=count+1; else count=0; while(VTcount!=singleChar&VTcount!=0) count+; if(VTcount=0) VTcount=singleChar; vtNum=count+1; j+; printf(输入的文法:n); for(k=0;k); printf(%c,Grammarkj); j+; printf(n); count=0; printf(VT:); while(VTcount!=0) printf(%3c,VTcount); count+; VTcount=#; vtNum=count+
7、1; printf(%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;igrammarNum;i+) j=1; while(Grammarij!=0) j+; VNumi=j; / printf(%3d,VNumi); printf(n); return
8、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=#; int Judge(int stateTop,char inputChar) int i,j; for(i=0;istateNum;i+)
9、 if(stateTop=i)break; for(j=0;jvtNum;j+) if(inputChar=AVTj)break; return Actionij; int GetGoto(int stateTop,char inputChar) int i,j; for(i=0;istateNum;i+) if(stateTop=i)break; for(j=0;jvnNum;j+) if(inputChar=GVNj)break; return Gotoij; int print(int count,int i,char Input,int action,int gt,int sign)
10、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(%c,symbolNum); q+; printf(t); j=i; jj=0; while(jj=A&Inputi=100) sign=1; action=ssValue-100; state
11、.top+; *state.top=action; symbol.top+; *symbol.top=Inputi; i+; print(count,i,Input,action,0,sign); count+; if(ssValue=50&ssValue100) sign=2; action=ssValue-50; gt=Pop(action); print(count,i,Input,action,gt,sign); count+; return 0; int main() ScanGrammar(); vNumCount(); InitStack(); Reduction(); return 0; 五、分析与讨论通过此次试验我学会了:掌握非递归预测分析的编程方法。成绩
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1