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

下载本文档

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

文档简介

编译原理实验报告题 目: 语法分析器 一. 实验目的及实验环境1:进一步熟悉编译原理程序设计语言。2:学习语法分析器的几点要求。3:学习语法分析器的设计,并编写简单语法分析程序。二. 实验内容 1)任意输入一个文法G; 2) 处理文法中可能存在的左递归和公共左因子问题; 3) 对文法中的每个非终结符自动生成并打印输出:(未实现,提前写死LL(1)文法) FIRST集; FOLLOW集; 4)判断处理后的文法是否为LL(1)文法, 如果是,自动生成并打印输出其预测分析表; 5) 模拟分析过程。 如输入一个句子,如果该句子合法则输出与句子 对应的语法树;能够输出分析过程中每一步符号 栈的变化情况。如果该句子非法则进行相应的报 错处理。 3 方案设计1:总控程序: 分析栈顶符号为X, 输入符为 a, 分析过程: X=a=# ,分析成功; X=a=#, X出栈,输入指针指向下一符号; XVN,查分析表,将产生式右部逆序入栈。2:测试文法:3:采用的数据结构及算法描述 建立两个数组,A数组用来存放分析栈中的内容,B数组用来存放输入串中的内容。首先给分析栈赋值为#E,开始扫描输入串中的文法(如:i),查找建好的预测分析表,E,i所用的产生式,再将产生式逆序输入存放到分析栈A中替换原来的非终结符E。依次往下找,直至找到产生式i,即可实现匹配,此时,分析栈-即将i出栈,输入串+向后继续扫描,当产生式为时,产生式不入栈,分析栈-,直到两个数组都是#,即完成了分析。四测试数据及运行结果(1):程序编译结果截图(2) :程序编译后分析表中内容截图五总结 作为编译原理第二次上机-语法分析器,是基于第一次词法分析器的基础上的。程序存在的问题是,没有对输入的文法进行分析判断是不是LL(1)文法,而是直接写死的LL(1)文法,建好分析表,在分析语法时直接查表的,所以接下来还需要尝试着写成动态的,任意输入文法,可进行First集,Follow集的分析输出,判断是不是LL(1)文法,再进行预测分析。六附录:源代码(电子版)#include#include#includechar A20;/*分析栈*/char B20;/*输入串*/char v120=i,+,-,*,/,(,),#;/*终结符 */FILE *fop; char v220=E,G,T,S,F;/*非终结符 */int j=0,b=0,top=0,l;/*L为输入串长度 */typedef struct type/*产生式类型定义 */char origin;/*大写字符 */char array5;/*产生式右边字符 */int length;/*字符个数 */type;type e,t,g,g0,g1,s,s0,s1,f,f1;/*结构体变量 */type C1010;/*预测分析表 */*输出分析栈 */void print()int a;for(a=0;a=top+1;a+)fprintf(fop,%c,Aa);fprintf(fop,tt);fflush(fop);/*输出剩余串*/void print1()int j;for(j=0;jb;j+)/*输出对齐符*/fprintf(fop, );for(j=b;j=l;j+)fprintf(fop,%c,Bj);fprintf(fop,ttt);fflush(fop);void main()int m,n,k=0,flag=0,finish=0;char ch,x;type cha;/*用来接受Cmn*/*把文法产生式赋值结构体*/e.origin=E;strcpy(e.array,TG);e.length=2;t.origin=T;strcpy(t.array,FS);t.length=2;g.origin=G;strcpy(g.array,+TG);g.length=3;g0.origin=G;strcpy(g0.array,-TG);g0.length=3;g1.origin=G;g1.array0=;g1.length=1; s.origin=S;strcpy(s.array,*FS);s.length=3;s0.origin=S;strcpy(s0.array,/FS);s0.length=3;s1.origin=S;s1.array0=;s1.length=1;f.origin=F;strcpy(f.array,(E);f.length=3;f1.origin=F;f1.array0=i;f1.length=1;/*初始化分析表*/for(m=0;m=4;m+)for(n=0;n=5;n+)Cmn.origin=N;/*全部赋为空*/ /*填充分析表*/C00=e;C05=e;C11=g;C12=g; C16=g1;C17=g1;C20=t;C25=t;C31=s1;C33=s;C34=s; C36=C37=s1;C40=f1;C45=f; printf(输入以#结束的字符串n);char in_fn30; FILE *fp; printf(n源文件名:); while(true) gets(in_fn); if(fp=fopen(in_fn,r)!=NULL) break; else printf(文件路径错误!请重新输入:); printf(n输出文件名:);gets(in_fn);fop=fopen(in_fn,w);printf(n查看输出文件%s,in_fn);fprintf(fop,nn); do/*读入分析串*/ ch=fgetc(fp); if (ch!=i) &(ch!=+)&(ch!=-)&(ch!=*)&(ch!=/)&(ch!=()&(ch!=)&(ch!=#) fprintf(fop,输入串中有非法字符n); exit(1); Bj=ch;/ 将输入串赋予剩余串 j+;while(ch!=#); l=j;/*分析串长度*/ch=B0;/*当前分析字符*/Atop=#; A+top=E;/*#,E进栈*/fprintf(fop,步骤tt分析栈 tt输入串 ttt所用产生式 n);dox=Atop-;/*x为当前栈顶字符*/fprintf(fop,%d,k+);fprintf(fop,tt);for(j=0;j=7;j+)if(x=v1j) flag=1; break;if(flag=1)/*如果是终结符*/ if(x=#) finish=1;/*结束标记*/ fprintf(fop,接受成功!n);/*接受 */ getchar(); getchar(); exit(1); if(x=ch) print(); print1(); fprintf(fop,%c (匹配)n,ch); ch=B+b;/*当遇到#时,输入串向后移一位,继续分析*/ flag=0;/*恢复标记*/ else /*出错处理*/ print(); print1(); fprintf(fop,%c出错n,ch);/*输出出错终结符*/ exit(1); else/*非终结符处理*/for(j=0;j=4;j+)if(x=v2j)m=j;/* m: 分析表行号*/break;for(j=0

温馨提示

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

评论

0/150

提交评论