




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验报告实验题目:语法分析器构造指导教师: 姓名: 班级:学号:实验成绩:实验题目语法分析器 实验目的和要求实验目的:在语法分析器原理学习和词法分析器实验基础上,学生自行设计实现一个高级语言语法分析器。通过实验使学生能够把原理和实现方法应用到如搜索引擎、描述语言语法分析等词法分析器的设计中去。借助于词法分析程序提供的分析结果,设计一个算符优先语法分析程序,程序能进行语法结构分析和错误检查并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。实验要求:实验结束写出实验报告。内容包括:实验课题名称、实验目的和要求,实验的实现(包括主要设计思想、实现算法、主要技术问题的处理方法及实验结果)结论分析。设计思想与框架设计思想与框架:通过课堂教学详细讲解语法分析器的基本原理,以及设计实现的基本方法,并通过一个实际语法分析器的案例分析,示范设计实现过程中的关键技术和技术难点,一般不规定具体的实现语言。首先规定算符,这里是文法的终极符之间的优先关系,然后根据这种优先关系,通过比较相邻算符的优先次序来确定句型中的“句柄”,然后进行归约。 算符优先分析法的关键:算符优先分析法的关键就是寻找当前句型中的最左素短语,并归约它。核心算法核心算法:语法分析前首先要对输入的文法和句子进行词法分析,去除多余的字符(空格、回车符等),并将产生式和终结符、非终结符填入有关数组,为语法分析做前期准备。用于构建输入文法的算符优先表,并在构建过程中检查该文法是否为算符优先文法,如果在构建过程中对同一对终结符计算出两次不一样的优先关系,则报错并停止接下来的任何步骤。源程序及注释本语法分析器所分析的源程序为:#include int main()int a,b,c;a=1;b=2;c=a+b; c=2*(a+b);printf(c=%dn,c);语法分析程序为:#include#include#include/存放归约步骤的一个整形数组/int step_result1000;/存放归约步骤的一个全局数组int step_result_len=0;/统计全局数组的长度每次清零应该/定义文法符号优先表用int型矩阵表示/int Matux88=1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1, -1,-1,-1,-1,-1,0,-1,-3,1,1,1,1,-2,1,-2,1,1,1,1,1,-2,1,-2,1,-1,-1,-1,-1,-1,-4,-1,0; char *STR6=N+N,N-N,N*N,N/N,(N),i;/定义文法可规约可归约字符串char stack100;/定义符号栈int stack_len=0;/定义初始化符号栈的长度为0int Getchar_len=0;/定义取得字符的全局在窜中的变量/bool IsLetter(char ch)/判断当前ch是否为字符/if(ch=a&ch=A&ch=0&ch&old_ch!=&old_ch!=!)ch=fgetc(fp);if(ch!=)while(ch!=;&!feof(fp)num_stringij=ch;ch=fgetc(fp);j+;i+;num_stringij=0;flag=i-1;fclose(fp);return flag;/将求出的算术表达式转化成可输入串的函数/void Convert_input_string(char num_string100,char input_string100)int i=0,i_input_str=0;char ch,flag_ch;/begin/ch=num_stringi;while(ch!=0)if(IsDigit(ch)flag_ch=0; else if(IsLetter(ch)flag_ch=a; elseflag_ch=ch; switch(flag_ch) case a: while(IsLetter(ch)|IsDigit(ch)|ch=_)&ch!=0) i+; ch=num_stringi; input_stringi_input_str=i; i-; break; case 0: while(IsDigit(ch)|ch=.)&ch!=0) i+; ch=num_stringi; input_stringi_input_str=i; i-; break; case : break; default : input_stringi_input_str=ch; break; i+;ch=num_stringi;if(ch!= )i_input_str+;input_stringi_input_str=#;/end/return;/自动取得是规约串中字符的一个函数/char Getchar(char input_string100)char ch;int i,len;char input_string_temp100=0;len=strlen(input_string);ch=input_string0;for(i=1;i=0&Find_two_table(ch)=9)return 1;elsereturn 0;/判断终结符之间的优先关系的一个函数/int Find_relaion(char stack_ch,char ch)/找出终结符之间的优先关系的一个函数int row,lie,result;row=Find_two_table(stack_ch);lie=Find_two_table(ch);if(lie7)&ch!=N)/printf(非法标识符%c,ch);return -10;result=Matuxrowlie;return result;/返回终结符对应的行数或者是列数/出错处理子程序/void Process_Error(int return_num)if(return_num=-2)/出错处理函数,一共有三种错误情况printf(Error!算术表达式缺少运算符,请查看更改!n);elseif(return_num=-3)printf(Error!算术表达式缺少右括号,请查看更改!n);elseif(return_num=-4)printf(Error!算术表达式缺少左括号,请查看更改!n);return;/函数结束/处理一个算术表达式的规约过程的函数/void main_analyous(char input_string100)int k,step=1,i,j,flag=0,p;int flag_temp=0,input_string_len;char ch,q_ch;char stack100=0,temp_str20=0;k=1;stackk=#; printf(步骤号 动作 优先关系 当前分析符 符号栈 剩余输入串n); printf( 1 预备 # %sn,input_string);ch=Getchar(input_string);char stack_pop= ;while(stack_pop!=#)if(Char_IsVt(ch)j=k;elsej=k-1;int error;/判断输入串中是不是存在非法符号的存在则返回-10/ error=Find_relaion(stackj,ch);if(error=(-10)printf(输入串中存在非法符号%c,输入串分析结束!n,ch);return;/while(Find_relaion(stackj,ch)=1)for(int h=0;h20;h+)/每次规约过程中存放可归约变量清零temp_strh=0;flag=0;/每次规约flag清零/doq_ch=stackj;if(Char_IsVt(stackj-1)j=j-1;elsej=j-2;while(Find_relaion(stackj,q_ch)=1)|(Find_relaion(stackj,q_ch)=0);/p=j+1;temp_strflag=stackp;/将stackj+1的字符给临时数组temp+str中进行和产生式右部进行比较while(pk)/循环一直到stackj+1=stackk结束p=p+1;flag+;temp_strflag=stackp;for(i=0;i6;i+)if(strcmp(temp_str,STRi)=0)while(p );printf(%7c ,ch);printf( ); for(int r=1;r=k;r+) printf(%c,stackr);for(r=0;r12-k;r+) printf( );input_string_len=strlen(input_string); for(r=0;r=input_string_len;r+) printf(%c,input_stringr);printf(n);/flag_temp=1;break;if(flag_temp=0)printf(Error!没有这样的产生式!n);/stackj+1到stackk规约过程结束/if(Find_relaion(stackj,ch)=-1)|(Find_relaion(stackj,ch)=0)k=k+1;stackk=ch;elseint error;error=Find_relaion(stackj,ch);Process_Error(error);return; /输出归约过程的一行的代码/ step+; printf(%4d ,step); printf( 移进 ); if(Find_relaion(stackj,ch)=-1) printf( ); if(Find_relaion(stackj,ch)=0) printf( = ); printf(%7c ,ch); printf( ); for(int r=1;r=k;r+) printf(%c,stackr); for(r=0;r12-k;r+) printf( );input_string_len=strlen(input_string); for(r=0;r=input_string_len;r+) printf(%c,input_stringr); printf(n);/ ch=Getchar(input_string); stack_pop=stackk; /判断最终规约后的符号栈中是否是#N#形式,如果是那么久分析正确/if(stack1=#)&(stack2=N)&(stack3=#)printf(输入的算术表达式正确!n);elseprintf(您输入的算术表达式有错误,请检查!n);return;/打印每个算术表达式求解的归约过程的一个函数/void Print_step()int i;for(i=0;iE+T|E-T|T 分析的是四则混合运算的文法 *n);printf(* T-T*F|T/F|F 其中:E表示算术表达式;T表示项; *n);printf(* F-(E)|i i表示变量或常数; *n);printf(*n);printf(* 终结符优先表 *n);printf(* + - * / ( ) i # *n);printf(* + *n); printf(* - *n);printf(* * *n);printf(* / *n);printf(* ( = e2 e2 *n);printf(* i e2 e2 *n);printf(* # e3 = *n);printf(*n);printf(*n);len=Find_num_string(num_string);/调用Find_num_string函数根据预处理的结果求救出每个算术表达式存放在二维字符数组num_string中 printf(n);for(i=0;ilen;i+)/根据求解出来的算术表达式循环的将其转换成输入串同时分析并且输出分析后的结果 for(j=0;j100;j+)/每次循环回来都要将上一个存放转换后的输入串清空 result_stringj=0;/每次循环回来都要将上一个存放转换后的输入串清空 printf(第%d个算术表达式是%sn ,i+1,num_stringi); Convert_input_string(num_stringi,result_string);/将每个算术表达转换成输入串形式 printf(转换为输入串形式是%sn,result_string); main_analyous(result_string);/分析每个转换后的输入串并且同时输出归约的过程 printf(第%d个算术表达式%s的归约步骤是:,i+1,num_stringi); Print_step();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中科学物质分离实验教学设计
- 农业信息化技术在种植养殖中的应用协议
- 2025年学历类自考思想道德修养与法律基础-成本会计参考题库含答案解析(5卷)
- 2025年学历类自考市场营销(三)-幼儿园组织与管理参考题库含答案解析(5卷)
- 2025年风湿免疫科疼痛管理知识检测试卷答案及解析
- 2025年学历类自考国际贸易实务(三)-生产与作业管理参考题库含答案解析(5卷)
- 2025年学历类自考国际经济法概论-思想道德修养与法律基础参考题库含答案解析(5卷)
- 少儿对称剪纸艺术教学教案
- 2025年学历类自考国际法-资产评估参考题库含答案解析(5卷)
- 第一单元第二课多彩的假期教学设计湘美版初中美术八年级上册
- 华中数控车床课件
- 2025年食品安全监督员专业技能考核试题及答案解析
- 七年级初一新生家长会上校长走心讲话:陪孩子一起长大是一场不能重来的旅程
- 企业微信办公使用教程
- 智慧零碳园区综合解决方案
- 学堂在线 大学历史与文化 章节测试答案
- 大学澡堂管理办法
- 2025年全国“质量月”企业员工全面质量管理知识竞赛题库及答案
- 百货商场服务礼仪培训
- 汉语言文学转专业考试题目含答案
- 神经外科一般护理常规
评论
0/150
提交评论