已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验三 语法分析的C语言实现一、 实验目的加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法分析。二、实验要求 1、在实验一(用C语言实现词法分析的程序)的基础上,实现编写语法分析程序,语法分析程序的实现可以采用任何一种编程工具。2、对语法规则有明确的定义;3、编写的分析程序能够对实验一的结果进行正确的语法分析;4、对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;三、实验分工个人完成4、 程序说明有文法GE:E-TG T-FS G-+TG| S-*FS|=E| F-(E)|i1.1 判断LL(1)文法 当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法,分析所给文法可知文法中不含左公因子,也不存在左递归,因而再对给定文法计算First集、Follow集以及Select集,对于求出的每个产生式的Select集,看对于同一个左部非终结符是否存在交集,如果它们的交为空则表示所给文法是LL(1)文法,否则不是L(1)文法。若所给文法是LL(1)文法,再根据求得的Select集合构造预测分析表,对于一个输入串,根据已知的预测分析表分析它是否是文法的句子。各非终结符的First集以及Follow集如下表所示:集合表1-1VNFirst集Follow集E(,i#,)T(,i+,#,)G+,#,)F(,i*,+,=,#S*,=,+,#,)各产生式的Select集:Select(E-TG)=(,iSelect(T-FS)=(,iSelect(G-+TG)=+ Select(G-)=#,)Select(S-*FS)=* Select(S-)=+,#,) Select(S-=E)=Select(F-(E)=( Select(F-i)=i由各产生式的Select集可以看出,每个非终结符的Select集交集为空,则可以确定该文法是LL(1)文法。1.2 构造预测分析表VT表1-2VNi+*()#=E-TG-TG-TGT-FS-FS-FSG-+TG-F-*FS-S-i-(E)-=E开始程序流程图结构体赋值预测分析表构造读入分析串有非法字符T提示错误F为终结符FTTF产生式T匹配提示错误出栈FFT为空提示错误不入栈逆序入栈T分析成功FTF匹配分析结束提示错误主要函数介绍:1、 void print();输出分析栈2、 void print1();输出剩余串3、 int main();程序主函数,在其中调用自定义函数,完成文法产生式的赋值,预测分析表的构建,以及对输入串的分析等主要功能。程序主要代码:1、初始化程序即分析栈、剩余串、非终结符与终结符的初始化char A20;/*分析栈*/ char B20;/*剩余串*/ char v120=i,+,*,(,),#,;,=;/*终结符 */ char v220=E,G,T,S,F;/*非终结符 */ int j=0,b=0,top=0,l;/*L为输入串长度 */2、结构体的定义及结构体变量定义 typedef struct type/*产生式类型定义 */ char origin;/*大写字符 */ char array5;/*产生式右边字符 */ int length;/*字符个数 */ type; type c,e,t,g,g1,s,s1,f,f1,s2;/*结构体变量 */ type C1010;/*预测分析表 */ 3、输出分析栈函数定义void print() int a; for(a=0;a=top+1;a+) printf(%c,Aa); printf(tt); 4、输出剩余串函数定义void print1() int j; for(j=0;jb;j+) printf( ); for(j=b;j=l;j+) printf(%c,Bj); printf(ttt); 5、在main函数中定义结构体,把文法产生式赋值给结构体 /*把文法产生式赋值结构体*/ 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; g1.origin=G; g1.array0=; g1.length=1; s.origin=S; strcpy(s.array,*FS); s.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; s2.origin=S; strcpy(s2.array,=E); s2.length=2;6、预测分析表的初始化及构造 for(m=0;m=7;m+)/*初始化分析表*/ for(n=0;n=7;n+) Cmn.origin=N;/*全部赋为空*/ /*填充分析表*/ C00=e;C03=e; C11=g;C14=g1;C15=C17=g1; C20=t;C23=t; C31=s1;C32=s;C34=C35=s1;C37=s2; C40=f1;C43=f; 7、读入分析串,对输入串进行分析,判断输入串是否符合文法的定义,是否有非法字符,是否在分析过程中出现错误信息,是否被接受为文法的句子 do x=Atop-;/*x为当前栈顶字符*/ printf(%d,k+); printf(tt); for(j=0;j=7;j+)/*判断是否为终结符*/ if(x=v1j) flag=1; break; if(flag=1)/*如果是终结符*/ if(x=#) finish=1;/*结束标记*/ printf(accept!n);/*接受 */ getchar(); getchar(); exit(1); if(x=ch) print(); print1(); printf(%c匹配n,ch); ch=B+b;/*下一个输入字符*/ flag=0;/*恢复标记*/ /*if*/ else/*出错处理*/ print(); print1(); printf(%c出错n,ch);/*输出出错终结符*/ exit(1); /*else*/ /*if*/ else/*非终结符处理*/ for(j=0;j=7;j+) if(x=v2j) m=j;/*行号*/ break; for(j=0;j,cha.origin);/*输出产生式*/ for(j=0;j=0;j-)/*产生式逆序入栈*/ A+top=cha.arrayj; if(Atop=)/*为空则不进栈*/ top-; /*if*/ else/*出错处理*/ print(); print1(); printf(%c出错n,x);/*输出出错非终结符*/ exit(1); while(finish=0); 编程中遇到的问题:栈的判断出错,无法对应和自行从终结符中提取预测分析表出错,定义后无法识别可改进的地方:1、 由于一个人实验,工作量实在太大,实力不足,总有很多问题卡住,于是根据书本先行使用书本文法进行编辑,先行使用i替换所有的字母数字2、 由于时间关系,没法对i进行改动区分开所有的字母数字,仍旧使用i进行操作判断3、 由于没对i进行编辑改动,导致了while以及if语句未能插入代码中,只能识别出赋值语句4、 做这份代码是太多太多的辛酸,认识到了实力不足时团队的重要性,还望老师谅解5、 截图六、#include #include#include #include#include using namespace std;char A20;/*分析栈*/ char B20;/*剩余串*/ char v120=i,+,*,(,),#,;,=;/*终结符 */ 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 c,e,t,g,g1,s,s1,f,f1,s2;/*结构体变量 */ type C1010;/*预测分析表 */ void print()/*输出分析栈 */ int a;/*指针*/ for(a=0;a=top+1;a+) printf(%c,Aa); printf(tt); void print1()/*输出剩余串*/ int j; for(j=0;jb;j+)/*输出对齐符*/ printf( ); for(j=b;j=l;j+) printf(%c,Bj); printf(ttt); int 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; g1.origin=G; g1.array0=; g1.length=1; s.origin=S; strcpy(s.array,*FS); s.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; s2.origin=S; strcpy(s2.array,=E); s2.length=2; for(m=0;m=7;m+)/*初始化分析表*/ for(n=0;nin_fn; if(fpin=fopen(in_fn,r)!=NULL) /判断文件是否存在break; elsecout文件路径错误!; do/*读入分析串*/ ch=fgetc(fpin); if (ch!=i) &(ch!=+) &(ch!=*)&(ch!=()&(ch!=)&(ch!=#)&(ch!=)&(ch!=;) printf(输入串中有非法字符n); exit(1); Bj=ch; j+; while(ch!=#); l=j;/*分析串长度*/ ch=B0;/*当前分析字符*/ Atop=#; A+top=E;/*#,E进栈*/ printf(步骤tt分析栈 tt剩余字符 tt产生式或匹配 n); do x=Atop-;/*x为当前栈顶字符*/ printf(%d,k+); printf(tt); for(j=0;j=7;j+)/*判断是否为终结符*/ if(x=v1j) flag=1; break; if(flag=1)/*如果是终结符*/ if(x=#) finish=1;/*结束标记*/ printf(accept!n);/*接受 */ getchar(); getchar(); exit(1); if(x=ch) print(); print1(); printf(%c匹配n,ch); ch=B+b;/*下一个输入字符*/ flag=0;/*恢复标记*/ /*if*/ else/*出错处理*/ print(); print1(); printf(%c出错n,ch);/*输出出错终结符*/ exit(1); /*else*/ /*if*/ else/*非终结符处理*/ for(j=0;j=7;j+) if(x=v2j) m=j;/*行号*/ break; for(j=0;j,cha.origin);/*输出产生式*/ for(j=0;j=0;j-)/*产生式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年临床路径与单病种相关知识考核试题与答案
- 2025年健康管理顾问师职业资格考试试题及答案
- 单位安全生产管理人员特种作业证考试题及答案(完整版)
- 2025年北京二手车买卖与二手车评估鉴定服务合同
- 县焦陂镇招考村级后备干部15人笔试备考题库附答案详解
- 2022年北京市安全员B证考试试题含答案参考15
- 2025注会审计试题大全及答案
- 四川省南充市高坪区2023-2024学年四年级上学期英语期末试卷(含答案)
- 钢结构施工维修合同(3篇)
- 2021年无人机驾照考试题库及答案(完整版)
- 7.2做全球发展的贡献者课件-高中政治统编版选择性必修一当代国际政治与经济
- 个人接受监督整改措施报告
- 2025年福州辅警考试题库(附答案)
- 2025至2030中国高模量碳纤维行业产业运行态势及投资规划深度研究报告
- DB45-T 2660-2023 孕产妇心理健康诊疗服务规范
- 《冠状动脉粥样硬化诊治进展》课件
- 2025年兰州市初中语文学业水平考试卷附答案解析
- 2026届安徽省江南十校化学高一第一学期期中考试模拟试题含解析
- 粉尘防护基本知识培训课件
- 个体防护知识培训课件
- 2025年湖北省武汉市中考数学试卷(含答案解析)
评论
0/150
提交评论