文法存储及输出_第1页
文法存储及输出_第2页
文法存储及输出_第3页
文法存储及输出_第4页
文法存储及输出_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上实验报告学号专业计算机班级姓名课程名称编译原理课程类型必修课实验名称实验一、文法存储及输出实验目的: 1.掌握文法在计算机内的存储表示; 2.输入任意的上下文无关文法;3.以四元组的形式输出Chomsky 文实验内容:叙述本次实验的实现方法、分析、实现了哪些功能、给出一个或多个测试用例及其预期运行结果,要求能够反映本次实验的成果。1.本次实验的实现方法为:采用数组的形式实现文法在机内的存储表示。2.本次试验的问题分析为:一是文法的输入形式;二是文法在计算机内的存储表示形式。3.本次试验应实现以下功能:输入一个文法的识别符号与重写规则,输出文法的四要素VN,VT,P,Z

2、。4.测试实例:实例:输入文法GE:E:=E+T|T T:=T*F|FF:=(E)|i实验代码如下:#include <stdio.h> char GName10; typedef char SymbolT; SymbolT StartSymbol; typedef struct SymbolT LeftSym; SymbolT Rightpart20; int RightLength; RuleTC; RuleTC GrammarC20; SymbolT VT20; SymbolT VN20; int NVN=0,NVT=0; typedef struct int LeftSym

3、Num; int RightpartNum20; int RightLength; RuleT; RuleT Grammar20; int RuleN; char StartSym; char Input 20= "E:=E+T|T", "T:=T*F|F", "F:=(E)|i", "0" ; int LineNumofG=3; void GetGrammar() char LeftS,Sym; int k,j,m; StartSym=GrammarC1.LeftSym; for(k=1; k<=RuleN

4、; k+) LeftS=GrammarCk.LeftSym; for(j=1; j<=NVN; j+) if(LeftS=VNj) Grammark.LeftSymNum=j+100; break; for(j=1; j<=GrammarCk.RightLength; j+) Sym=GrammarCk.Rightpartj; for(m=1; m<=NVN; m+)if(Sym=VNm) Grammark.RightpartNumj=m+100;break; if(m<=NVN) continue; for(m=1; m<=NVT; m+) if(Sym=VTm

5、) Grammark.RightpartNumj=m; break; Grammark.RightLength=GrammarCk.RightLength; void storeG( ) int row,colum, k,j,m; char sym,U; RuleN=0; row=0; NVN=NVT=0; while(row<LineNumofG) colum=0; sym=Inputrowcolum; for(k=1; k<=NVN; k+) if(sym=VNk) break; if(k>NVN) VN+NVN=sym; GrammarC+RuleN.LeftSym=s

6、ym; colum=colum+4; j=0; while(Inputrowcolum!='0') sym=Inputrowcolum+; if(sym='|') GrammarCRuleN.RightLength=j;U=GrammarCRuleN.LeftSym; RuleN=RuleN+1; GrammarCRuleN.LeftSym=U; j=0; continue; j=j+1; GrammarCRuleN.Rightpartj=sym; for(k=1;k<=NVT; k+)if( sym=VTk) break;if(k>NVT)VT+N

7、VT=sym; GrammarCRuleN.RightLength=j; row=row+1; for( m=1; m<=NVT; m+) for(k=1; k<=NVN; k+) if(VTm=VNk) VTm=' ' break; for(m=1;m<=NVT; m+) if(VTm=' ') for(j=m+1; j<=NVT; j+) VTj-1=VTj; NVT=NVT-1; if(VTm=' ') m=m-1; continue; GetGrammar( ); DispG( ) int k,j,m; print

8、f("n 文法的识别符号 Z 为:%cn", StartSym); printf("重写规则集 P 为:n"); for(k=1; k<=RuleN; k+) printf("%8c%c:=",' ', VNGrammark.LeftSymNum-100); for(j=1; j<=Grammark.RightLength; j+) m=Grammark.RightpartNumj; if(m<100) printf("%c",VTm); else printf("%c&

9、quot;,VNm-100); printf("n"); printf("文法的非终结符号集为:VN= "); for(k=1; k<=NVN-1; k+) printf("%c", VNk); printf(","); printf("%c n",VNNVN); printf("文法的终结符号集为:VT= "); for(k=1; k<=NVT-1; k+) printf("%c", VTk); printf(",");

10、printf("%c n",VTNVT); void main( ) char c='Y' int j; printf("n 文法重写规则:n"); for(j=0; j<LineNumofG; j+) printf("%sn",Inputj); printf("重新输入文法的重写规则?(Y/N): "); scanf("%c",&c); if(c='Y' | c='y') printf("输入行数(一个规则一行):"); scanf("%d",&LineNumofG); for(j=0; j<LineNumofG; j+) scanf("%s",Inputj); storeG( ); DispG( ); 实验结果:实例一:输入文法GE:E:=E+T|T T:=T*F|FF:=(E)|i实例二:输入文法G2Z:Z:=aZb|ab Z:=CSd S:=CSd|Cd实例三:输入文法G3E:E:=T|E+T|E-TT:=F|T*F|T/F F:=(E)|i实例四:输入文法:G4Z:Z:=Ab|c A:=Aa

温馨提示

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

评论

0/150

提交评论