资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验3-4 预测分析表方法班级:_ _ 学号:_ _ 姓名:_ _ 得分:_ _一、实验目的理解预测分析表方法的实现原理。二、实验内容: 编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。 二、实验内容提示1算法数据构造: 构造终结符数组:char Vt105=“id”,”+”; 构造非终结符数组:char Vn10= ; 构造follow集数组:char *follow1010= (可将follow集与预测分析表合并存放)数据构造示例(使用的预测分析表构造方法1):/*data1.h简单算术表达式数据*/charVN105=E,E,T,T,F; /非终结符表intlength_vn=5; /非终结符的个数charVT155=id,+,*,(,),#; /终结符表intlength_vt=6; /终结符的个数charFa1510=TE,+TE,FT,*FT,(E),id; /产生式表:0:E-TE 1:E-+TE 2:E-空 / 3:T-FT 4:T-*FT 5:T-空 6:F-(E) 7:F-idintanalysis_table1011=0,-2,-2,0,-1,-1,0,0,0,0,0,-2,1,-2,-2,2,2,0,0,0,0,0,3,-1,-2,3,-1,-1,0,0,0,0,0,-2,5, 4,-2,5, 5,0,0,0,0,0,7,-1,-1,6,-1,-1,0,0,0,0,0;/预测分析表,-2表示出错不属于终结符的follow集合,-1表示该行终结符的follow集合,用于错误处理,正数表示产生式在数组Fa中的编号,右部五列0表示多余的列。(1) 预测分析表的构造方法1给文法的正规式编号:存放在字符数组中,从0开始编号,正规式的编号即为该正规式在数组中对应的下标。如上述Fa数组表示存储产生式。构造产生式数组:char P1010=“E-TE”,”E-+TE”,.; (产生式可只存储右半部分,如E-TE可存储为TE ,正规式中的符号可替换,如可将E改为M ) 构造预测分析表:int analyze_table1010= /数组元素值存放产生式的编号,-1、-2表示出错 (2)预测分析表的构造方法2 可使用三维数组Char analyze_table101010= 或Char *analyze_table1010= 2针对预测分析表构造方法1的查预测分析表的方法提示:(1) 查非终结符表得到非终结符的序号no1(2) 查终结符表得到终结符的序号no2(3) 根据no1和no2查预测分析表得到对应正规式的序号no3=analyze_tableno1no2 ,如果no3=-1 表示出错。 (4) 根据no3查找对应的正规式Fano3(5) 对正规式进行处理3错误处理机制紧急方式的错误恢复方法(抛弃某些符号,继续向下分析)(1)栈顶为非终结符A,串中当前单词属于FOLLOW(A),则从栈中弹出A(此时可认为输入串中缺少A表示的结构),继续分析。 -错误编号为1(2)栈顶为非终结符A,串中当前单词不属于FOLLOW(A),则可使串指针下移一个位置(认为输入串中当前单词多余),继续分析。-错误编号为2(3)栈顶为终结符,且不等于串中当前单词,则从栈中弹出此终结符(认为输入串中缺少当前单词)或者将串指针下移一个位置(认为串中当前单词多余)。在程序中可选择上述两种 观点中的一种进行处理。-错误编号3因此error()函数的编写方式可按如下方式处理Error(int errornum)If(errornum=1)Else if(errornum=2)Else ./或者可用choose case语句处理4增加了错误处理的预测分析程序预测分析程序的算法: 将“#”和文法开始符依次压入栈中; 把第一个输入符号读入a;do把栈顶符号弹出并放入x中;if(xVT)if(xa) 将下一输入符号读入a;else error(3);elseif(Mx,a“xy1y2yk”)按逆序依次把yk、yk1、y1压入栈中;输出“xy1y2yk”;else if afollow(x)error(1); else error(2); /在前述的数据定义中查表为-1表示afollow(x)while(x!=“#”)三实验要求给定算术表达式文法,编写程序。测试数据:1算术表达式文法ETE E +TE|- TE| TFT T *FT |/ FT |%FT| F(E) |id|num给定一符合该文法的句子,如id+id*id$,或输入二元式序列(词法分析的结果,预测分析程序只用到二元式中的第一个元的值):(id,0)(+,-)(id,1)(*,-)(id,2),运行预测分析程序,给出分析过程和每一步的分析结果。输出形式参考下图($为结束符): 2 作业3.10 文法四、 实验过程源程序:#include#include#include#includeusing namespace std;#define MAXSIZE 100typedef char DataType;typedef struct /定义栈DataType dataMAXSIZE;int top;SeqStack;SeqStack *s;int sign=0;int num1,num2,num3;char VN105=E,M,T,N,F;/非终结符表int length_vn=5;/非终结符个数char VT155=+,-,*,/,%,(,),i,n,#;/终结符表int length_vt=10; /终结符个数char Fa155=TM,+TM,-TM,FN,*FN,/FN,%FN,(E),i,n;/产生式表 1:E-TM,2:M-+TM,3:M-TM,4:M- ,5:E-FN,6:N- ,7:N-*FN,8:F-/FN,9:F-%FN,10:F-(E),11:F-i,12:f-nChar Pa1510=E-TM,M-+TM,M-TM,M-空,T-FN,N-空,N-*FN,F-/FN,F-%FN,F-(E),F-id,F-num;int analysis_table1011= -1,-1,-1,-1,-1,1,-2,1,1,-1,0,2,3,-1,-1,-1,-1,4,-1,-1,4,0,-2,-2,-1,-1,-1,5,-2,5,5,-1,0,6,6,7,8,9,-1,6,-1,-1,6,0,-2,-2,-2,-2,-2,10,-2,11,12,-1,0;/预测分析表 SeqStack *Init_SeqSTACK()/栈初始化 /SeqStack *s; s=new SeqStack; if(!s) printf(空间不足n); return NULL; else s-top=-1; return s; void Push_SeqStack(SeqStack *s,char x)/入栈 if (s-top=MAXSIZE-1) printf(栈满,不能入栈!);/return 0; else s-top+; s-datas-top=x; /return 1; char Pop_SeqStack(SeqStack *s)/出栈 if(s-top=-1) printf(栈空,不可出栈!);/ return 0;exit(0); else char x=s-datas-top; s-top-; return x; DataType Top_SeqStack(SeqStack *s) /取栈顶元素 if(s-top=-1) return 0; else return s-data s-top ; int BufVT(char s) /接收终结符并保存在VT数组中int i=0;while(i15&s!=n)if(VTi0=s)return 1;elsei+;return 0; int BufVN(char s) /接收非终结符并保存在VN数组中int i=0;while(i10&s!=n)if(VNi0=s)return 1;elsei+;return 0; int VTT(char s) /终结符匹配int i=0;while(VTi0!=s)i+;return i; int VNN(char s) /非终结符匹配int i=0;while(VNi0!=s&ilength_vn)i+;if(i=leng
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号