LL1分析法.docx
- 文档编号:24591231
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:17
- 大小:163.89KB
LL1分析法.docx
《LL1分析法.docx》由会员分享,可在线阅读,更多相关《LL1分析法.docx(17页珍藏版)》请在冰豆网上搜索。
LL1分析法
计算机科学与技术系
实验报告
专业名称计算科学与技术
课程名称编译原理
项目名称LL
(1)分析法
班级14计科一班
学号
姓名
同组人员无
实验日期2016.11.11
一、实验目的与要求:
(简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。
)
目的:
根据某一文法编制调试LL
(1)分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对预测分析LL
(1)分析法的理解。
要求:
对下列文法,用LL
(1)分析法对任意输入的符号串进行分析:
(1)E-TG
(2)G-+TG|—TG
(3)G-ε
(4)T-FS
(5)S-*FS|/FS
(6)S-ε
(7)F-(E)
(8)F-i
相关知识点:
LL
(1)分析法运用的是自顶向下的分析法,通过显示地维护一个栈进行语法分析。
其主要过程就是匹配替换的过程,还设计first集和follow集的算法。
二、实验内容
(根据本次实验项目的具体任务和要求,完成相关内容,可包括:
实验目的、算法原理、实验仪器、设备选型及连线图、算法描述或流程图、源代码、实验运行步骤、关键技术分析、测试数据与实验结果、其他)
内容:
1、根据上述文法编制调试LL
(1)分析程序,以便对任意输入的符号串进行分析。
2、构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析构造。
3、分析法的功能是利用LL
(1)控制程序根据显示栈栈顶内容、向前看符号以及LL
(1)分析表,对输入符号串自上向下的分析过程。
模块结构:
(1)定义部分:
定义常量,变量,数据结构。
(2)初始化:
设立LL
(1)分析法、初始化变量空间(包括堆栈、构造体、数组、临时变量等);
(3)控制部分:
从键盘输入一个表达式符号串。
(4)利用LL
(1)分析算法进行表达式处理:
根据LL
(1)分析表达式对表达式符号串进行堆栈(或其它)操作,输出分析结果,如果遇到错误则显示错误信息。
流程图如下
文字表示如下:
从左到右扫描输入串(源程序),同时采用最左推导,且对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。
在实现LL
(1)分析法的过程中必须按照实验的要求给的产生式写出first集和follow集创建预测分析表,用户输入的一个文法,对文法进行检测和处理,消除左递归,得到LL
(1)文法,这个文法应该满足:
无二义性,无左递归,无左公因子。
当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL
(1)分析表,最后利用分析表,根据LL
(1)语法分析构造一个分析器。
才能实现接下来的过程。
LL
(1)的语法分析程序包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈。
LL
(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号ch过程的。
程序中将要用到的几个重要数据如下:
一个全局变量ch,存放由文件输入得到的字符。
一个函数宏READ(ch),实现读取文件中的字符。
五个处理:
非终结符E,G,T,S,F。
程序代码如下:
#include
usingnamespacestd;
constintMaxLen=10;//初始化栈的长度
constintLength=10;//初始化数组长度
charVn[5]={'E','G','T','S','F'};//非终结符数组
charVt[8]={'i','(',')','+','-','*','/','#'};//终结符数组
charch,X;//全局变量,ch用于读当前字符,X用于获取栈顶元素
charstrToken[Length];//存储规约表达式
structLL//ll
(1)分析表的构造字初始化
{
char*c;};
LLE[8]={"TG","TG","error","error","error","error","error","error"};
LLG[8]={"error","error","null","+TG","-TG","error","error","null"};
LLT[8]={"FS","FS","error","error","error","error","error","error"};
LLS[8]={"error","error","null","null","null","*FS","/FS","null"};
LLF[8]={"i","(i)","error","error","error","error","error","error"
};
classstack//栈的构造及初始化
{
public:
stack();//初始化
boolempty()const;//是否为空
boolfull()const;//是否已满
boolget_top(char&c)const;//取栈顶元素
boolpush(constcharc);//入栈
boolpop();//删除栈顶元素
voidout();//输出栈中元素
~stack(){}//析构
private:
intcount;//栈长度
chardata[MaxLen];//栈中元素
};
stack:
:
stack(){
count=0;//栈初始化长度为0
}
boolstack:
:
empty()const{
if(count==0)
returntrue;
returnfalse;
}
boolstack:
:
full()const{
if(count==MaxLen)
returntrue;
returnfalse;
}
boolstack:
:
get_top(char&c)const{
if(empty())
returnfalse;
else
{
c=data[count-1];//栈顶的第一个元素
returntrue;
}
}
boolstack:
:
push(constcharc){
if(full())
returnfalse;
data[count++]=c;//入栈
returntrue;
}
boolstack:
:
pop()
{
if(empty())
returnfalse;
count--;
returntrue;
}
voidstack:
:
out(){//输出栈的元素
for(inti=0;i cout< cout<<""; } intlength(char*c){ intl=0; for(inti=0;c[i]! ='\0';i++)//读取栈中元素,不为空即加1 l++; returnl; } voidprint(inti,char*c)//剩余输入串的输出 { for(intj=i;j cout< cout<<""; } voidrun(){ boolflag=true;//循环条件 intstep=0,point=0;//步骤、指针 intlen;//长度 cout<<"请输入要规约的字符串(与i有关的串): "< cin>>strToken; ch=strToken[point++];//读取第一个字符 stacks;//栈类定义一个元素 s.push('#');//栈中数据初始化 s.push('E'); s.get_top(X);//取栈顶元素 cout<<"步骤"<<"分析栈"<<"剩余输入串"<<"所用产生式"<<"动作"< cout< s.out(); print(point-1,strToken); cout<<""<<"初始化"< while(flag) { if((X==Vt[0])||(X==Vt[1])||(X==Vt[2])||(X==Vt[3])||(X==Vt[4])||(X==Vt[5])||(X==Vt[6]))//判断是否为终结符(不包括#) { if(X==ch)//输入的字符是终结符,识别,进行下一字符规约 { s.pop(); s.get_top(X); ch=strToken[point++]; cout< s.out(); print(point-1,strToken); cout<<""<<"GETNEXT(I)"< } else { flag=false; cout<<"error! "< }} elseif(X=='#')//规约结束 { if(X==ch) { cout< s.out(); print(point-1,strToken); cout<<""< s.pop(); flag=false; } else { flag=false; cout<<"error! "< } } elseif(X==Vn[0])//非终结符E { for(inti=0;i<8;i++)//查分析表 if(ch==Vt[i]) { if(strcmp(E[i].c,"error")==0)//出错 { flag=false; cout<<"error"< } else{//对形如X->X1X2的产生式进行入栈操作 s.pop(); len=length(E[i].c)-1; for(intj=len;j>=0;j--) s.push(E[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intz=len;z>=0;z--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[1])//同上,处理G { for(inti=0;i<8;i++) if(ch==Vt[i]) { if(strcmp(G[i].c,"null")==0) { s.pop(); cout< s.out(); print(point-1,strToken); cout<<""< s.get_top(X); } elseif(strcmp(G[i].c,"error")==0) { flag=false; cout<<"error"< } else{ s.pop(); len=length(G[i].c)-1; for(intj=len;j>=0;j--) s.push(G[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intz=len;z>=0;z--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[2])//同上处理T { for(inti=0;i<8;i++) if(ch==Vt[i]) { if(strcmp(T[i].c,"error")==0) { flag=false; cout<<"error"< } else{ s.pop(); len=length(T[i].c)-1; for(intj=len;j>=0;j--) s.push(T[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intz=len;z>=0;z--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[3])//同上处理S { for(inti=0;i<8;i++) if(ch==Vt[i]) { if(strcmp(S[i].c,"null")==0) { s.pop(); cout< s.out(); print(point-1,strToken); cout<<""< s.get_top(X); } elseif(strcmp(S[i].c,"error")==0) { flag=false; cout<<"error"< } else{ s.pop(); len=length(S[i].c)-1; for(intj=len;j>=0;j--) s.push(S[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intz=len;z>=0;z--) cout< cout<<")"< s.get_top(X); }} } elseif(X==Vn[4])//同上处理F { for(inti=0;i<7;i++) if(ch==Vt[i]){ if(strcmp(F[i].c,"error")==0) { flag=false; cout<<"error"< }else{ s.pop(); len=length(F[i].c)-1; for(intj=len;j>=0;j--) s.push(F[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intz=len;z>=0;z--) cout< cout<<")"< s.get_top(X); } } } else//出错处理 { flag=false; cout<<"error"< } } } intmain() { run(); system("pause"); return0; } 程序运行结果如下: 三、实验分析与小结: (实验过程中的问题分析、产生的原因以及解决方法;实验结果分析;有待优化思路) 经过这个实验的练习,通过对程序的分析,让我进一步了解了LL (1)分析法的算法和思想以及它的代码实现,虽然上课上对LL (1)分析法理论上听懂了,但是真正要上机写代码的时候还是无从下手,然后在网上找到了别人写的代码,进行一步步的分析,在分析的时候,也遇到很多问题,刚开始根本想不到用程序怎么实现LL (1)分析法,后来看了别人的程序,才明白怎么转换成程序写,在看代码的过程中,其实还会觉得代码不是自己写的,所以很多时候原作者的思想并不能完全看明白,需要询问同学为什么,觉得自己看明白了,但是去上老师那里答辩的时候,老师问的问题就会卡住,才发现自己写和看懂别人的代码真的是不一样,力图以后能自己去编写,这样的理解会更深刻。 虽然不是自己写的,但对LL (1)分析法的理解也从理论部分上升到程序实现的级别,由理论上升到实际,会更了解它的用途。 四、其它 无 得分(百分制)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LL1 分析