ll1实验.docx
- 文档编号:7745317
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:10
- 大小:17.62KB
ll1实验.docx
《ll1实验.docx》由会员分享,可在线阅读,更多相关《ll1实验.docx(10页珍藏版)》请在冰豆网上搜索。
ll1实验
一、实验题目 LL
(1)语法分析
二、实验成员
三、实验目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。
四、实验内容
构造LL
(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。
程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合则输出错误信息。
消除递归前的文法 消除递归后的等价文法
E→E+T E→TE’
E→T E’→+TE’|ε
T→T*F T→FT’
T→F T’→*FT’|ε
F→(E)|i F→(E)|i
根据已建立的分析表,对下列输入串:
i+i*i进行语法分析,判断其是否符合文法。
五、实验要求
1.根据已由的文法规则建立LL
(1)分析表;
2.输出分析过程。
请输入待分析的字符串:
i+i*i
符号栈 输入串 所用产生式
#E i+i*i# E→TE’
#E’T i+i*i# T→FT’
#E’T’F i+i*i# F→i
#E’T’i i+i*i#
#E’T’ +i*i# T’→ε
#E’ +i*i# E’→+TE’
#E’T+ +i*i#
#E’T i*i# T→FT’
#E’T’F i*i# F→i
#E’T’i i*i#
#E’T’ *i# T’→*FT’
#E’T’F* *i#
#E’T’F i# F→i
#E’T’i i#
#E’T’ # T’→ε
#E’ # E’→ε
# #
六、程序思路
模块结构:
1、定义部分:
定义常量、变量、数据结构。
2、初始化:
设立LL
(1)分析表、初始化变量空间(包括堆栈、结构体等);
3、运行程序:
让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则;
4、利用LL
(1)分析算法进行表达式处理:
根据LL
(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。
七、程序流程图
输入要分析的串
判断输入串是否正确
判断分析句型
是否完全匹配?
成功
失败
否
是
是
否
八、程序调试与测试结果
运行后结果如下:
九、实验心得
沈毅:
递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL
(1)文法。
它的基本思想是,对文法中的每个终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。
由于描述语言的文法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归的方式进行调用。
当然实验中我也发现了自己的不足之处,我会在今后的学习生活中努力提高自己的编程水平.
吴立杰:
我们选用自顶向下分析技术时,首先必须判断所给文法是否是LL
(1)文法,然后编写构造LL
(1)语法分析程序。
因而对任给文法需计算FIRST、FOLLOW、SELECT集合,进而判别文法是否为LL
(1)文法.通过本次实验,不仅使我编译原理的知识更加巩固,而且可以使理论与实践相结合,更好的掌握所学知识。
我也发现自己的不足之处,以后会多加改正。
林建兴:
LL
(1)表明自顶向下分析技术是从左向右扫描输入串,分析过程中将用最左推导,以及只需向右看一个符号便可决定如何推导的一种文法。
通过这次实验,我加深对预测分析LL
(1)分析法的理解。
知道对任意文法需要计算FIRST、FOLLOW集合和SELECT集合,进而判别文法是否为LL
(1)文法。
让我更深一层次的认识了这种分析方法,有助于今后的学习,对编程的发展有了更大的空间。
十、参考文献:
教材:
《编译原理(第2版)》,吕映芝、张素琴、蒋维杜编著,清华大学出版社
教学参考书:
1、《编译程序设计原理》,杜淑敏、王永宁编著,北大出版社
2、《编译原理与实现》,金成植编著,高教出版社
3、《编译原理》,陈火旺、刘春林等编著,国防工业出版社
附件:
程序清单:
/*程序名称:
LL
(1)文法分析程序*/
/*E->E+T|T*/
/*T->T*F|F*/
/*F->(E)|i*/
/************************************/
/********************************************/
/*程序相关说明*/
/*A=E’B=T’*/
/*0=E1=E’2=T3=T’4=F*/
/*0=i1=+ 2=* 3=(6=)4=#*/
/************************************/
#include"iostream.h"
#include"stdio.h"
#include"malloc.h"
#include"conio.h"
structLchar{
charchar_ch;
structLchar*next;
}Lchar,*p,*h,*temp,*top,*base;
charcurchar;
charcurtocmp;
intright;
inttable[5][8]={{1,0,0,1,0,0},
{0,1,0,0,1,1},
{1,0,0,1,0,0},
{0,1,1,0,1,1},
{1,0,0,1,0,0}};
inti,j;
voidpush(charpchar)
{
temp=(structLchar*)malloc(sizeof(Lchar));
temp->char_ch=pchar;
temp->next=top;
top=temp;
}
voidpop(void)
{
curtocmp=top->char_ch;
if(top->char_ch!
='#')
top=top->next;
}
voiddoforpush(intt)
{
switch(t)
{
case0:
push('A');push('T');break;
case5:
push('A');push('T');break;
case11:
push('A');push('T');push('+');break;
case20:
push('B');push('F');break;
case23:
push('B');push('F');break;
case32:
push('B');push('F');push('*');break;
case40:
push('i');break;
case43:
push(')');push('E');push('(');
}
}
voidchangchartoint()
{
switch(curtocmp)
{
case'A':
i=1;break;
case'B':
i=3;break;
case'E':
i=0;break;
case'T':
i=2;break;
case'F':
i=4;
}
switch(curchar)
{
case'i':
j=0;break;
case'+':
j=1;break;
case'*':
j=2;break;
case'(':
j=3;break;
case')':
j=4;break;
case'#':
j=5;
}
}
voiddosome(void)
{
intt;
for(;;)
{
pop();
curchar=h->char_ch;
printf("\n%c\t%c",curchar,curtocmp);
if(curtocmp=='#'&&curchar=='#')
break;
if(curtocmp=='A'||curtocmp=='B'||curtocmp=='E'||curtocmp=='T'||curtocmp=='F')
{
if(curtocmp!
='#')
{
changchartoint();
if(table[i][j])
{
t=10*i+j;
doforpush(t);
continue;
}
else
{
right=0;
break;
}
}
else
if(curtocmp!
=curchar)
{
right=0;
break;
}
else
break;
}
else
if(curtocmp!
=curchar)
{
right=0;
break;
}
else
{
h=h->next;
continue;
}
}
}
voidmain(void)
{
charch;
cout<<"*文件名称:
语法分析"< cout<<" "< cout<<"/*程序相关说明*/"< cout<<"---------------------------------------------------------------------"< cout<<"-/*A=E’B=T’*/"< cout<<"-*目 的: 对输入LL (1)文法字符串,本程序能自动判断所给字符串是 -"< cout<<"-* 否为所给文法的句子,并能给出分析过程。 -"< cout<<"-*-------------------------------------------------------------------"< cout<<"表达式文法为: "< cout<<" E->E+T|T"< cout<<" T->T*F|F"< cout<<" F->(E)|i"< cout<<"请在下行输入要分析的串(#号结束): "< right=1; base=(structLchar*)malloc(sizeof(Lchar)); base->next=NULL; base->char_ch='#'; temp=(structLchar*)malloc(sizeof(Lchar)); temp->next=base; temp->char_ch='E'; top=temp; h=(structLchar*)malloc(sizeof(Lchar)); h->next=NULL; p=h; do{ ch=getch(); putch(ch); if(ch=='i'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#') { temp=(structLchar*)malloc(sizeof(Lchar)); temp->next=NULL; temp->char_ch=ch; h->next=temp; h=h->next; } else { temp=p->next; printf("\nInputawrongchar! Inputagain: \n"); for(;;) { if(temp! =NULL) printf("%c",temp->char_ch); else break; temp=temp->next; } } }while(ch! ='#'); p=p->next; h=p; dosome(); if(right) printf("\n成功! \n"); else printf("\n错误! \n"); getch(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ll1 实验