


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验报告(预测分析表方法) 预测分析表方法 一、实验目的 理解预测分析表方法的实现原理。 二、实验内容: 编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。 三、实验步骤 1算法数据构造: 构造终结符数组:char vt105=“id”,”+”; 构造非终结符数组:char vn10= ; 构造follow集数组:char *follow1010= (可将follow集与预测分析表合并存放) 数据构造示例(使用的预测分析表构造方法1): /*data1.h简单算术表达式数据*/ char vn
2、105=,; /非终结符表 int char vt155=,; /终结符表 int char fa1510=,; /产生式表:0:e-te 1:e-+te 2:e-空 / 3:t-ft 4:t-*ft 5:t-空 6:f-(e) 7:f-id int analysis_table1011=0,-1,-1,0,-2,-2,0,0,0,0,0, -1,1,-1,-1,2,2,0,0,0,0,0, 3,-2,-1,3,-2,-2,0,0,0,0,0, -1,5, 4,-1,5, 5,0,0,0,0,0, 7,-2,-2,6,-2,-2,0,0,0,0,0; length_vt=6; /终结符的个数
3、length_vn=5; /非终结符的个数 /预测分析表,-1表示出错,-2表示该行终结符的follow集合,用于错误处理,正数表示产生式在数组fa中的编号,0表示多余的列。 (1) 预测分析表的构造方法1 给文法的正规式编号:存放在字符数组中,从0开始编号,正规式的编号即为该正规式在数组中对应的下标。如上述fa数组表示存储产生式。 构造正规式数组:char p1010=“e-te”,”e-+te”,.; (正规式可只存储右半部分,如e-te可存储为te ,正规式中的符号可替换,如可将e改为m ) 构造预测分析表:int analyze_table1010= /数组元素值存放正规式的编号,-1
4、表示出错 (2)预测分析表的构造方法2 可使用三维数组 char analyze_table101010= 1 或 char *analyze_table1010= 2针对预测分析表构造方法1的查预测分析表的方法提示: (1) 查非终结符表得到非终结符的序号no1 (2) 查终结符表得到终结符的序号no2 (3) 根据no1和no2查预测分析表得到对应正规式的序号 no3=analyze_tableno1no2 ,如果no3=-1 表示出错。 (4) 根据no3查找对应的正规式fano3 (5) 对正规式进行处理 3错误处理机制 紧急方式的错误恢复方法(抛弃某些符号,继续向下分析) (1)栈顶
5、为非终结符a,串中当前单词属于follow(a),则从栈中弹出a(此时可认为输入串中缺少a表示的结构),继续分析。 -错误编号为1 (2)栈顶为非终结符a,串中当前单词不属于follow(a),则可使串指针下移一个位置(认为输入串中当前单词多余),继续分析。-错误编号为2 (3)栈顶为终结符,且不等于串中当前单词,则从栈中弹出此终结符(认为输入串中缺少当前单词)或者将串指针下移一个位置(认为串中当前单词多余)。在程序中可选择上述两种 观点中的一种进行处理。-错误编号3 因此error()函数的编写方式可按如下方式处理 error(int errornum) if(errornum=1) els
6、e if(errornum=2) else . /或者可用choose case语句处理 4增加了错误处理的预测分析程序预测分析程序的算法: 将“#”和文法开始符依次压入栈中; 把第一个输入符号读入a; do 把栈顶符号弹出并放入x中; if(xvt) if(xa) 将下一输入符号读入a; else error(3); else if(mx,a“xy1y2yk”) 按逆序依次把yk、yk?1、y1压入栈中; 输出“xy1y2yk”; 2 else if a?follow(x)error(1); else error(2); /在前述的数据定义中查表为-2表示a?follow(x) while(
7、x!=“#”) 给定算术表达式文法,编写程序。 测试数据: 1算术表达式文法 ete e +te|- te| tft t *ft |/ ft |%ft| f(e) |id|num 给定一符合该文法的句子,如id+id*id$,运行预测分析程序,给出分析过程和每一步的分析结果。 输出形式参考下图($为结束符): 3 #include #include #include #define tt 0 char aa20=int pp=0; # if tt char vn5=e,e,t,t,f; /非终结符表 int length_vn=5; /非终结符的个数 char vt10=*,l,m,+,-,(
8、,),i,n,#; /终结符表 l-/ m-% i-id n-num int length_vt=10; /终结符的个数 char fa126=/产生式表:0:e-te 1:e-+te 2:e-te 3:e-空 char f126=int analysis_table510=-2,-2,-2,-2,-2,0,-1,0,0,-1, -2,-2,-2,1,2,-2,3,-2,-2,3, -2,-2,-2,-1,-1,4,-1,4,4,-1, 5,6,7,8,8,-2,8,-2,-2,8, -1,-1,-1,-1,-1,9,-1,10,11,-1; # else char vn4=a,z,b,y;
9、/非终结符表 int length_vn=4; /非终结符的个数 char vt5=a,l,d,b,#; /终结符表 int length_vt=5; /终结符的个数 4 char fa66= char f66=int analysis_table45=0,-2,-1,-2,-1, 1,-2,2,-2,2, -2,-1,3,-2,-2, -2,5,-2,4,-2; # endif char stack50; int top=-1; void initscanner() /程序初始化:输入并打开源程序文件 int i=0; file *fp; if(fp=fopen( printf( exit(0); char ch=fgetc(fp); while(ch!=eo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 作文宁波的巨变教学课件
- 2020-2025年二级建造师之二建建设工程施工管理题库综合试卷A卷附答案
- 2025年铜陵市郊区事业单位公开招聘笔试(含加分)笔试历年典型考题及考点剖析附带答案详解
- 电位分析法饮用水中pH值测定57课件
- 彩云追月教学课件
- 第六章反应器第一节概述94课件
- 2025年全年检验科三基三严考试试题及答案
- 小学生科普知识课件
- 口罩与呼吸健康课件图片
- 企业等级评定管理办法
- 企业安全生产隐患排查奖励制度
- 临水作业安全培训
- 2025年北京市中考数学真题试卷及答案解析
- 2025至2030免税行业产业运行态势及投资规划深度研究报告
- 东北大学课件介绍
- 大学生平面设计工作室创业计划书范文
- 家具工艺培训课件
- 产业园广告管理制度
- 2025年新疆中考数学真题试卷及答案
- 托辊安装方案(3篇)
- 供水知识课件
评论
0/150
提交评论