LL(1)语法分析实验报告
一、实验题目 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=E 1=E’ 2=T 3=T’ 4=F */
/* 0=i 1=+ 2=* 3=( 6=) 4=# */
/************************************/
#include"iostream.h"
#include "stdio.h"
#include "malloc.h"
#include "conio.h"
struct Lchar{
char char_ch;
struct Lchar *next;
}Lchar,*p,*h,*temp,*top,*base;
char curchar;
char curtocmp;
int right;
int table[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}};
int i,j;
void push(char pchar)
{
temp=(struct Lchar*)malloc(sizeof(Lchar));
temp->char_ch=pchar;
temp->next=top;
top=temp;
}
void pop(void)
{
curtocmp=top->char_ch;
if(top->char_ch!='#')
top=top->next;
}
void doforpush(int t)
{
switch(t)
{
case 0:push('A');push('T');break;
case 5:push('A');push('T');break;
case 11:push('A');push('T');push('+');break;
case 20:push('B');push('F');break;
case 23:push('B');push('F');break;
case 32:push('B');push('F');push('*');break;
case 40:push('i');break;
case 43:push(')');push('E');push('(');
}
}
void changchartoint()
{
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;
}
}
void dosome(void)
{
int t;
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;
}
}
}
void main(void)
{
char ch;
cout<<"* 文件名称: 语法分析"<<endl;
cout<<" "<<endl;
cout<<"/* 程序相关说明 */"<<endl;
cout<<"---------------------------------------------------------------------"<<endl;
cout<<"-/* A=E’ B=T’ */"<<endl;
cout<<"-* 目 的: 对输入LL(1)文法字符串,本程序能自动判断所给字符串是 -"<<endl;
cout<<"-* 否为所给文法的句子,并能给出分析过程。 -"<<endl;
cout<<"-*-------------------------------------------------------------------"<<endl;
cout<<"表达式文法为:"<<endl;
cout<<" E->E+T|T"<<endl;
cout<<" T->T*F|F"<<endl;
cout<<" F->(E)|i"<<endl;
cout<<"请在下行输入要分析的串(#号结束):"<<endl;
right=1;
base=(struct Lchar*)malloc(sizeof(Lchar));
base->next=NULL;
base->char_ch='#';
temp=(struct Lchar*)malloc(sizeof(Lchar));
temp->next=base;
temp->char_ch='E';
top=temp;
h=(struct Lchar*)malloc(sizeof(Lchar));
h->next=NULL;
p=h;
do{
ch=getch();
putch(ch);
if(ch=='i'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')
{
temp=(struct Lchar*)malloc(sizeof(Lchar));
temp->next=NULL;
temp->char_ch=ch;
h->next=temp;
h=h->next;
}
else
{
temp=p->next;
printf("\nInput a wrong char!Input again:\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();
}
LL(1)语法分析实验报告相关推荐
- java lr0分析,LR0分析器实验报告.doc
<编译?原理> 课程设?计性实验报告 课程?题目: ? ?LR(0)分析法 姓? 名: ? ? 钟继文 ?专业班级: ? 计算机科?学与技术(1)班 指?导老师: ? ? 孙长圣老师 学 ...
- 编译原理实验报告一:PL0语言编译器分析(PL0,词法分析,语法分析,中间代码生成)
实验报告一:PL0语言编译器分析 一.实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码, 加深对编译阶段(包括词法分析.语法分析.语义分析.中间代码生成等)和编译系统软件结构的理解 ...
- 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)
实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求 根 ...
- 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...
- c语言的适当大小的子集,编译原理上机实验报告
编译原理上机实验报告,编制C语言子集的词法分析程序,编制递归下降法的语法分析程序 编译技术上机实验题目 实验一 一.题目 编制C语言子集的词法分析程序 二.目的 通过设计.编制.调试一个具体的词法分析 ...
- 2017春季学期编译原理期末实验报告
实验名:PL/0编译器的实现 一.实验目的 理解编译器的工作机制,掌握编译器的构造方法 掌握词法分析器的生成工具LEX的用法 掌握语法分析器的生成工具YACC的用法 二.实验内容简要概括 1.实验分为 ...
- 201506110135陈若倩词法分析实验报告
实验一.词法分析实验 商业软件工程专业 陈若倩 201506110135 一. 实验目的 通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解. 二. 实验 ...
- c 语言编写编译原理语义分析实验,北邮 编译原理 语义分析实验报告
<北邮 编译原理 语义分析实验报告>由会员分享,可在线阅读,更多相关<北邮 编译原理 语义分析实验报告(14页珍藏版)>请在人人文库网上搜索. 1.编译原理第六章 语义分析目 ...
- 数据库原理实验报告【全集】
如果对你有帮助,记得点赞哦! 实验1~8:SQL Server 2008的安装及管理工具的使用.SQL Server数据库的管理.SQL Server数据表的管理.数据查询.索引和视图.数据完整性.T ...
最新文章
- CVPR 2021 | RfD-Net: 从点云中重建三维物体实例
- Android测试中被测应用挂了怎么办?
- mysql 更新索引_MySQL索引优化
- linux7 语言包,Centos 7中文语言包的安装及中文支持
- 电脑显示苹果5s未连接服务器怎么办啊,iphone5s数据线连接不上电脑怎么办【解决方法】...
- 2017.9.29 谁能赢呢? 思考记录
- 开放 接口 饿了么_饿了么口碑启动生态赋能计划 将在210城开放智慧餐厅业务合作窗口...
- pragma autonomous_transaction详解
- 基于Unity引擎的RPG3D项目开发笔录
- STM32F103和STM32F401的ADC多通道采集DMA输出
- java中instant_Instant
- unable to install wkhtmltopdf with patched qt in ubuntu 16.04
- 短视频平台还能这样赚钱?无需拍视频,每天能赚200多详细流程
- 一文了解数据分析师视角下的数据中台
- 小程序时间段选择 选取某天的某时间段 基于vantweapp的时间段选择器 日期选择器
- 一个计算数独的小程序
- usb驱动的基本结构和函数简介
- 初学JSP,运行一个JSP小程序
- OGRE源码分析---Resource 板块分析
- 如何修改MTK 6592 手机(如果华为荣耀3X系列)IMEI码
热门文章
- 小霸王其乐无穷~FC红白机游戏600合集(支持mac 12.x系统)
- c语言中swap表示什么意思,swap是什么意思_单片机里的SWAP A是什么意思啊?
- 【Android开发-4】进入实践,最喜欢折腾的计算器
- 运用遗传算法求解函数极值(fortran)
- 手把手教你给女朋友编写一个公众号定时推送(java版本)
- 产品经理--用户研究
- frangi黑森矩阵_消灭黑森臭虫
- 用Burg法估计AR模型的参数原理详解及matlab实现
- 我使用Hexo+Github搭建Blog的经验
- FPGA知识汇集-值得收藏的FPGA代码命名规范?