首页 编译原理语法实验

编译原理语法实验

举报
开通vip

编译原理语法实验实验三:递归下降分析法 实验二:自上而下语法分析 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。 本次实验的目的主要是加深对自上而下分析法的理解。 二、实验预习提示 自下而上分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法 A.递归下降 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法实验设计思想及算...

编译原理语法实验
实验三:递归下降分析法 实验二:自上而下语法分析 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。 本次实验的目的主要是加深对自上而下分析法的理解。 二、实验预习提示 自下而上分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法 A.递归下降 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法实验 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 具体为: (1)对于每个非终结符号U->u1|u2|…|un处理的方法如下: U( ) { ch=当前符号; if(ch可能是u1字的开头) 处理u1的程序部分; else if(ch可能是u2字的开头)处理u2的程序部分; … else error() } (2)对于每个右部u1->x1x2…xn的处理架构如下: 处理x1的程序; 处理x2的程序; … 处理xn的程序; (3)如果右部为空,则不处理。 (4)对于右部中的每个符号xi ①如果xi为终结符号: if(xi= = 当前的符号) { NextChar(); return; } else 出错处理 ②如果xi为非终结符号,直接调用相应的过程xi() 说明: NextChar为前进一个字符函数。 B.LL(1)分析法 1、LL(1)分析法的功能 LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。 2、LL(1)分析法实验设计思想及算法 三、实验过程和指导: (一)准备: 1.阅读课本有关章节, 2.考虑好 设计方案 关于薪酬设计方案通用技术作品设计方案停车场设计方案多媒体教室设计方案农贸市场设计方案 ; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用两种分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG (3)G->ε (4)T->FS (5)S->*FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下: (1)递归下降分析程序 输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# 输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 (2)LL(1)分析: 输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# 输出结果:i+i*i#为合法符号串 注意: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 3.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 分析栈 剩余输入串 所用产生式 E i+i*i# E->TG 4.与读文件有关的函数: FILE *fp;       if((fp=fopen("E:\\222.txt","r"))==NULL){   //读取文件内容,并返回文件指针,该指针指向文件的第一个字符  fprintf(stderr,"error opening.\n");            exit(1);       } fgetc(fp) 从数据流中区下一个字符 fopen  文件打开函数,返回指向文件第一个字符的指针 (四)程序思路(仅供参考): 递归下降分析法: 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 LL(1)分析法: 模块结构: 1、定义部分:定义常量、变量、数据结构。 2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等); 3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则; 4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。 部分代码示例: #include #include #include #include struct Stack{ char s[30]; int top; /*栈顶指针 */}S1; char v1[6]={'i','+','*','(',')','#'};/*终结符 */ char v2[5]={'E','G','T','S','F'};/*非终结符 */ /*用二维数组保存预测分析表,可用符号^来代替ε,注意字符串结束位自动加'\0' */ char table[5][6][4]={{“TG”,””,””,””,”TG”,””},{…},{…},{…},{…}} void print()/*输出分析栈 */ { int a;/*指针*/ for(a=0;a 表格 关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载 是否为空白,是则出错,否则进栈*/ void main() { FILE *fp;char sym,X;bool flag,cuo;       if((fp=fopen("E:\\222.txt","r"))==NULL){   //读取文件内容,并返回文件指针,该指针指向文件的第一个字符  fprintf(stderr,"error opening.\n");            exit(1);       } initialstack(); push('#');push('E'); sym=fgetc(fp);/*把第一个输入符号读进sym*/ flag=true; cuo=false while (flag&&!error) { X=pop(); if (X=='#') { ….} else if iszhongjie(X) { ……} else if(!chabiao(X,sym)) cuo=true; } } (五)练习该实验的目的和思路: 需要利用程序设计语言的知识和大量编程技巧,通过这个练习可大大提高软件开发能力。通过练习,掌握函数间相互调用的方法。 (六)为了能设计好程序,注意以下事情: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 :模块关系简图、流程图、全局变量、函数接口等。 3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 五、上交: 实验报告: 实验名称 实验目的和要求 (一)实验内容 (1)功能描述:该程序具有什么功能? (2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。 (3)程序源代码 (二)实验过程 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 :出错次数、出错严重程度、解决办法摘要。 (三)实验总结:你在编程过程中花时多少?遇到了哪些难题?你是怎么克服的?你的收获有哪些? 自上而下分析算法 #include #include #define ERROR 0 char sym; //用于临时存储文件中读出的单个字符 FILE *fp; //读取文件的指针 //非终结符定义的方法 void e(); void g(); void t(); void s(); void f(); //读取文件中的下一个字符 void advance(); void main() { if((fp=fopen("E:\\222.txt","r"))==NULL)//读取文件内容,并返回文件指针,该指针指向文件的第一个字符 { fprintf(stderr,"error opening.\n"); exit(1); } e(); } //对应产生式(1)E->TG void e() { advance(); t(); g(); if(sym=='#') { printf("输入的为合法的字符串\n"); } else { printf("非法字符串"); } } //对应产生式(2)G->+TG (3)G->ε 空 :不做任何处理 void g() { if(sym =='+') { printf("+"); advance(); t(); g(); } } //对应产生式 (4)T->FS void t() { f(); s(); } // 对应产生式(5)S->*FS (6)S->ε void s() { if(sym=='*') { printf("*"); advance(); f(); s(); } } //对应产生式(7)F->(E) (8)F->i void f() { if(sym=='(') { advance(); e(); if(sym==')') advance(); else { printf("非法字符串"); exit(ERROR); } } else if(sym=='i') { printf("i"); advance(); } else { printf("非法字符串"); exit(ERROR); } } void advance() { sym=fgetc(fp);// 从数据流中区下一个字符 } 预测表分析法 #include #include #include #include struct Stack{ char s[30]; int top; /*栈顶指针 */ }S1; int num=0; char v1[6]={'i','+','*','(',')','#'};/*终结符 */ char v2[5]={'E','G','T','S','F'};/*非终结符 */ /*用二维数组保存预测分析表,可用符号^来代替ε,注意字符串结束位自动加'\0' */ char table[5][6][4]={{"GT","","","GT","",""},{"","GT+","","","^","^"},{"SF","","","SF","",""},{"","^","SF*","","^","^"},{"i","","",")E(","",""}}; void print()/*输出分析栈 */ { int a;/*指针*/ for(a=0;a",X); for(int i=(strlen(table[hang][lie])-1);i>=0;i--) printf("%c",table[hang][lie][i]); printf("\n"); } jinzhan(hang,lie); return true; } else { printf("错误\n"); return false; } } /*判断X是否为非终结符,sym是否为终结符,若是查找预测表对应表格是否为空白,是则出错,否则进栈*/ void shuchuchuan() { FILE *fp1; char c; int num1=0; if((fp1=fopen("E:\\222.txt","r"))==NULL){ //读取文件内容,并返回文件指针,该指针指向文件的第一个字符 fprintf(stderr,"error opening.\n"); exit(1); } c=fgetc(fp1); while(c!='#') { if(num1>=num) printf("%c",c); else printf(" "); c=fgetc(fp1); num1++; } printf("#\t"); } void main() { FILE *fp;char sym,X;bool flag,cuo; if((fp=fopen("E:\\222.txt","r"))==NULL){ //读取文件内容,并返回文件指针,该指针指向文件的第一个字符 fprintf(stderr,"error opening.\n"); exit(1); } intialstack(); push('#'); push('E'); sym=fgetc(fp);/*把第一个输入符号读进sym*/ flag=true; cuo=false; printf("符号栈\t输入串\t所用产生式\n"); while(flag&&!cuo) { print(); shuchuchuan(); X=pop(); if (X=='#') { if(sym==X) { printf("成功"); flag=false; } else printf("错误"); } else if(iszhongjie(X)!=-1) { printf("\n"); if(X==sym) { num++; sym=fgetc(fp); } else printf("错误"); } else if(!chabiao(X,sym)) { cuo=true; } } }
本文档为【编译原理语法实验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_791264
暂无简介~
格式:doc
大小:70KB
软件:Word
页数:11
分类:互联网
上传时间:2011-05-26
浏览量:68