编译原理--递归下降分析实验C++

一、实验项目要求

1.实验目的

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。

2.实验要求

对下列文法,用递归下降分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG|—TG

(3)G->ε

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F->(E)

(8)F->i

输出的格式如下:

(1)递归下降分析程序,编制人:姓名,学号,班级

(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#

(3)输出结果:i+i*i#为合法符号串

备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。

注意:

1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;

2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);

二、理论分析或算法分析

1、程序设计:

(1)模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。

(2)写出设计方案:模块关系简图、流程图、全局变量、函数接口等。

(3)程序编写:

①定义部分:定义常量、变量、数据结构。

      ②初始化:从文件将输入符号串输入到字符缓冲区中。

      ③利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。

三、实验方法

程序流程图如图所示:

四、实验结果分析

实验结果图

遇到的问题

(1)遇到如图所示的问题:

解决办法

(1)在文件顶部加入一行#define _CRT_SECURE_NO_WARNINGS后可以解决;

通过本次实验,学习了语法分析,让我对语法分析有了一定的认识和了解。递归下降分析法,是一种确定的自顶向下分析技术,它的实现思想是,对文法分别代表一种语法成分的每个非终结符号编写一个子程序,已完成非终结符号所对应的语法成分的分析任务。在分析过程中调用一系列过程或函数,对源程序进行语法语义分析直到整个程序处理结束;即使理解了理论知识,我也不一定会编程。

五、代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>char a[50], b[50], d[500], e[10];
char ch;
int n1, i1 = 0, flag = 1, n = 5;
int E();
int E1();
int T();
int G();
int S();
int F();
void input();
void input1();
void output();
void main()                      /*递归分析*/
{int f, p, j = 0;char x;d[0] = 'E';d[1] = '=';d[2] = '>';d[3] = 'T';d[4] = 'G';d[5] = '#';printf("递归下降分析程序,编制人:***,**号,******班\n");printf("输入一以#结束的符号串(包括+ - * / ( ) i #,且长度小于50):");do {scanf("%c", &ch);a[j] = ch;j++;} while (ch != '#');n1 = j;ch = b[0] = a[0];printf("文法\t分析串\t\t\t分析字符\t\t剩余串\n");f = E1();if (f == 0) return;if (ch == '#'){printf("accept\n");p = 0;x = d[p];//	{//			printf("%c",x);p=p+1;x=d[p];          /*输出推导式*///		}	while (a[p] != '#')printf("%c", a[p++]);printf("为合法字符!\n");}else {//	printf("error\n");j = 0;while (a[j] != '#')printf("%c", a[j++]);printf("非法字符!\n");printf("回车返回\n");getchar(); getchar();return;}printf("\n");printf("回车返回\n");getchar();getchar();
}
int E1()
{int f, t;printf("E-->TG\t");flag = 1;input();input1();f = T();if (f == 0) return(0);t = G();if (t == 0) return(0);else return(1);
}int E()
{int f, t;printf("E-->TG\t");e[0] = 'E'; e[1] = '='; e[2] = '>'; e[3] = 'T'; e[4] = 'G'; e[5] = '#';output();flag = 1;input();input1();f = T();if (f == 0)return(0);t = G();if (t == 0) return(0);else return(1);
}
int T()
{int f, t;printf("T-->FS\t");e[0] = 'T'; e[1] = '='; e[2] = '>'; e[3] = 'F'; e[4] = 'S'; e[5] = '#';output();flag = 1;input();input1();f = F();if (f == 0)return(0);t = S();if (t == 0) return(0);else return(1);
}
int  G()
{int f;if (ch == '+'){b[i1] = ch;printf("G-->+TG\t");e[0] = 'G'; e[1] = '='; e[2] = '>'; e[3] = '+'; e[4] = 'T'; e[5] = 'G'; e[6] = '#';output();flag = 0;input(); input1();ch = a[++i1];f = T();if (f == 0)return(0);f = G();if (f == 0)return 0;else return 1;}else if (ch == '-'){b[i1] = ch;printf("G-->-TG\t");e[0] = 'G'; e[1] = '='; e[2] = '>'; e[3] = '-'; e[4] = 'T'; e[5] = 'G'; e[6] = '#';output();flag = 0;input(); input1();ch = a[++i1];f = T();if (f == 0){//			printf("G=%d\n",f);return(0);}f = G();if (f == 0)return 0;else return 1;}else{printf("G-->^\t");e[0] = 'G'; e[1] = '='; e[2] = '>'; e[3] = '^'; e[4] = '#';output();flag = 1;input(); input1();return(1);}
}int S()
{int f, t;if (ch == '*'){b[i1] = ch;printf("S-->*FS\t");e[0] = 'S'; e[1] = '='; e[2] = '>'; e[3] = '*'; e[4] = 'F'; e[5] = 'S'; e[6] = '#';output();flag = 0;input(); input1();ch = a[++i1];f = F();if (f == 0)return(0);t = S();if (t == 0)return(0);else return(1);}else if (ch == '/'){b[i1] = ch;printf("S-->/FS\t");e[0] = 'S'; e[1] = '='; e[2] = '>'; e[3] = '/'; e[4] = 'F'; e[5] = 'S'; e[6] = '#';output();flag = 0;input(); input1();ch = a[++i1];f = F();if (f == 0)return(0);t = S();if (t == 0)return(0);else return(1);}else{printf("S-->^\t");e[0] = 'S'; e[1] = '='; e[2] = '>'; e[3] = '^'; e[4] = '#';output();flag = 1;a[i1] = ch;input(); input1();return(1);}
}
int F()
{int f; int j;if (ch == '('){b[i1] = ch;printf("F-->(E)\t");e[0] = 'F'; e[1] = '='; e[2] = '>'; e[3] = '('; e[4] = 'E'; e[5] = ')'; e[6] = '#';output();flag = 0;input(); input1();ch = a[++i1];f = E();if (f == 0) return(0);if (ch == ')'){b[i1] = ch;printf("F-->(E)\t");flag = 0; input(); input1();ch = a[++i1];}else{printf("error\n");j = 0;while (a[j] != '#')printf("%c", a[j++]);printf("非法字符!\n");return(0);}}else if (ch == 'i'){b[i1] = ch;printf("F-->i\t");e[0] = 'F'; e[1] = '='; e[2] = '>'; e[3] = 'i'; e[4] = '#';output();flag = 0; input(); input1();ch = a[++i1];}else {printf("error\n");j = 0;while (a[j] != '#')printf("%c", a[j++]);printf("非法字符!\n");return(0);}return(1);
}
void input()
{int j = 0;for (; j <= i1 - flag; j++)printf("%c", b[j]);                    /*输出分析串*/printf("\t\t\t");printf("%c\t\t\t", ch);                  /*输出分析字符*/
}void input1()
{int j;for (j = i1 + 1 - flag; j < n1; j++)printf("%c", a[j]);                     /*输出剩余字符*/printf("\n");
}
void output() {                              /*推导式计算*/int m, k, j, q;int i = 0;m = 0; k = 0; q = 0;i = n;d[n] = '='; d[n + 1] = '>'; d[n + 2] = '#'; n = n + 2; i = n;i = i - 2;while (d[i] != '>'&&i != 0) i = i - 1;i = i + 1;while (d[i] != e[0]) i = i + 1;q = i;m = q; k = q;while (d[m] != '>')  m = m - 1;m = m + 1;while (m != q) {d[n] = d[m]; m = m + 1; n = n + 1;}d[n] = '#';for (j = 3; e[j] != '#'; j++) {d[n] = e[j];n = n + 1;}k = k + 1;while (d[k] != '=') {d[n] = d[k]; n = n + 1; k = k + 1;}d[n] = '#';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297497.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试工程师简历项目经验怎么写?--9999个已成功入职的软件测试工程师真实简历

简历是我们求职的第一步&#xff0c;也是非常重要的一步。 青云叔叔看过太多简历&#xff0c;最快3秒就淘汰一份简历&#xff0c;因为其实我们每天要收到很多简历进行筛选&#xff0c;那么面试官其实也是会很快进行对简历进行判断的&#xff0c;如果你对简历写的一塌糊涂&…

Elasticsearch 写入优化探索:是什么影响了refresh 耗时?

1、问题背景&#xff1a; 数据写入后&#xff0c;refresh耗时过长&#xff0c;能达到1s-5s。 想通过测试&#xff0c;探索确认影响refresh的因素&#xff0c;比如&#xff1a;写入操作是新增还是更新&#xff0c;deleted文档占比是否有影响&#xff0c;是否有其他索引配置&…

.halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者&#xff1a; 网络安全是当今数字时代的一大挑战&#xff0c;各种勒索病毒如.halo病毒层出不穷&#xff0c;对用户和企业的数据安全构成了严重威胁。本文将介绍.halo勒索病毒&#xff0c;以及如何恢复被其加密的数据文件&#xff0c;同时提供预防措施。在面对被勒索…

软件测试工程师简历项目经验怎么写?--1000个已成功入职的软件测试工程师简历范文模板(含真实简历)

说到好的测试人员的简历&#xff0c;其实并没有什么标准。因为每个人的简历都是根据自己的个人情况、个人目标而编写的&#xff0c;所以只有合适的简历&#xff0c;没有什么所谓的好的简历。拿经历来说吧&#xff1a;做培训的时候&#xff0c;要给每一个学员辅导&#xff0c;教…

Java中的Stream流收集器

目录 1、归约和汇总 2、分组 3、分区 4、理解收集器接口 Java 中 Stream 流用来帮助处理集合&#xff0c;类似于数据库中的操作。 在 Stream 接口中&#xff0c;有一个抽象方法 collect&#xff0c;你会发现 collect 是一个归约操作&#xff08;高级规约&#xff09;&#…

2023航天推进理论基础考试划重点(W老师)-液体火箭发动机1

适用于期末周求生欲满满的西北工业大学学生。 1、液体火箭发动机的基本组成及功能是什么&#xff1f; 推力室组件、推进剂供应系统、阀门与调节器、发动机总装元件等组成。 2、液体火箭发动机的分类和应用是什么&#xff1f;3、液体火箭发动机系统、分系统的概念是什么&…

微前端——无界wujie

B站课程视频 课程视频 课程课件笔记&#xff1a; 1.微前端 2.无界 现有的微前端框架&#xff1a;iframe、qiankun、Micro-app&#xff08;京东&#xff09;、EMP&#xff08;百度&#xff09;、无届 前置 初始化 新建一个文件夹 1.通过npm i typescript -g安装ts 2.然后可…

Unity-Shader-渲染队列

Unity-Shader-渲染队列 渲染简介Unity中的几种渲染队列Background (1000)最早被渲染的物体的队列。Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染&#xff0c;也就是Unity Shader中默认的渲染队列。AlphaTest (2450) 有透明通道&#xff0c;需要进…

社会人士可以考英语四六级吗?怎么考四六级

目录 一、社会人士能考英语四六级吗二、社会人士可以参加哪些英语等级考试第一.考个商务英语类证书第二.社会上比较认可的还有翻译证书第三.出国常用的英语凭证第四.职称英语.第五.PETS. 大学英语四六级是为提高我国大学英语课程的教学质量服务。那么社会人士能不能报考英语四六…

【Python从入门到进阶】45、Scrapy框架核心组件介绍

接上篇《44、Scrapy的基本介绍和安装》 上一篇我们学习了Scrapy框架的基础介绍以及环境的搭建&#xff0c;本篇我们来学习一下Scrapy框架的核心组件的使用。 下面的核心组件的介绍&#xff0c;仍是基于这幅图的机制&#xff0c;大家可以再回顾一下&#xff1a; 注&#xff1a;…

设计模式 建造者模式 与 Spring Bean建造者 BeanDefinitionBuilder 源码与应用

建造者模式 定义: 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示主要作用: 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象如何使用: 用户只需要给出指定复杂对象的类型和内容, 建造者模式负责按顺序创建复杂对象…

Spring Cloud + Vue前后端分离-第7章 核心业务功能开发

Spring Cloud Vue前后端分离-第7章 核心业务功能开发 7-1 课程管理功能开发 课程管理页面美化 1.课程管理页面美化 demo-course.jpg 复制search.html中的部分代码 course.vue 看效果 测试一下新增修改删除效果 1.课程管理页面美化2 scoped:style下的样式只应用于当前组件…