一、实验题目  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)语法分析实验报告相关推荐

  1. java lr0分析,LR0分析器实验报告.doc

    <编译?原理> 课程设?计性实验报告 课程?题目: ? ?LR(0)分析法 姓? 名: ? ? 钟继文 ?专业班级: ? 计算机科?学与技术(1)班 指?导老师: ? ? 孙长圣老师 学 ...

  2. 编译原理实验报告一:PL0语言编译器分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告一:PL0语言编译器分析 一.实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码, 加深对编译阶段(包括词法分析.语法分析.语义分析.中间代码生成等)和编译系统软件结构的理解 ...

  3. 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求        根 ...

  4. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

    递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...

  5. c语言的适当大小的子集,编译原理上机实验报告

    编译原理上机实验报告,编制C语言子集的词法分析程序,编制递归下降法的语法分析程序 编译技术上机实验题目 实验一 一.题目 编制C语言子集的词法分析程序 二.目的 通过设计.编制.调试一个具体的词法分析 ...

  6. 2017春季学期编译原理期末实验报告

    实验名:PL/0编译器的实现 一.实验目的 理解编译器的工作机制,掌握编译器的构造方法 掌握词法分析器的生成工具LEX的用法 掌握语法分析器的生成工具YACC的用法 二.实验内容简要概括 1.实验分为 ...

  7. 201506110135陈若倩词法分析实验报告

    实验一.词法分析实验 商业软件工程专业   陈若倩  201506110135 一. 实验目的 通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解. 二. 实验 ...

  8. c 语言编写编译原理语义分析实验,北邮 编译原理 语义分析实验报告

    <北邮 编译原理 语义分析实验报告>由会员分享,可在线阅读,更多相关<北邮 编译原理 语义分析实验报告(14页珍藏版)>请在人人文库网上搜索. 1.编译原理第六章 语义分析目 ...

  9. 数据库原理实验报告【全集】

    如果对你有帮助,记得点赞哦! 实验1~8:SQL Server 2008的安装及管理工具的使用.SQL Server数据库的管理.SQL Server数据表的管理.数据查询.索引和视图.数据完整性.T ...

最新文章

  1. CVPR 2021 | RfD-Net: 从点云中重建三维物体实例
  2. Android测试中被测应用挂了怎么办?
  3. mysql 更新索引_MySQL索引优化
  4. linux7 语言包,Centos 7中文语言包的安装及中文支持
  5. 电脑显示苹果5s未连接服务器怎么办啊,iphone5s数据线连接不上电脑怎么办【解决方法】...
  6. 2017.9.29 谁能赢呢? 思考记录
  7. 开放 接口 饿了么_饿了么口碑启动生态赋能计划 将在210城开放智慧餐厅业务合作窗口...
  8. pragma autonomous_transaction详解
  9. 基于Unity引擎的RPG3D项目开发笔录
  10. STM32F103和STM32F401的ADC多通道采集DMA输出
  11. java中instant_Instant
  12. unable to install wkhtmltopdf with patched qt in ubuntu 16.04
  13. 短视频平台还能这样赚钱?无需拍视频,每天能赚200多详细流程
  14. 一文了解数据分析师视角下的数据中台
  15. 小程序时间段选择 选取某天的某时间段 基于vantweapp的时间段选择器 日期选择器
  16. 一个计算数独的小程序
  17. usb驱动的基本结构和函数简介
  18. 初学JSP,运行一个JSP小程序
  19. OGRE源码分析---Resource 板块分析
  20. 如何修改MTK 6592 手机(如果华为荣耀3X系列)IMEI码

热门文章

  1. 小霸王其乐无穷~FC红白机游戏600合集(支持mac 12.x系统)
  2. c语言中swap表示什么意思,swap是什么意思_单片机里的SWAP A是什么意思啊?
  3. 【Android开发-4】进入实践,最喜欢折腾的计算器
  4. 运用遗传算法求解函数极值(fortran)
  5. 手把手教你给女朋友编写一个公众号定时推送(java版本)
  6. 产品经理--用户研究
  7. frangi黑森矩阵_消灭黑森臭虫
  8. 用Burg法估计AR模型的参数原理详解及matlab实现
  9. 我使用Hexo+Github搭建Blog的经验
  10. FPGA知识汇集-值得收藏的FPGA代码命名规范?