语法分析!!!

news2024/11/26 14:38:04

一、实验题目

根据给定文法编写调试预测分析程序,对任意输入串用预测分析法进行语法分析。

二、实验目的

加深对预测分析法的理解。

三、实验内容

在这里插入图片描述

四、实验代码

#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <stack> 
using namespace std; 
char Vn[] = { 'E','e','T','t','F' }; //定义文法的非终结符,小写字母e表示E’
char Vt[] = { 'i','+','*','(',')','#' };//定义文法的终结符 
int LENVt = sizeof(Vt); 
void showstack(stack<char> st) //从栈底开始显示栈中的内容 
{ 
int i, j; 
char ch[100]; 
j = st.size(); 
for (i = 0; i < j; i++) 
{ 
ch[i] = st.top(); //依次获取栈顶元素并赋值给ch数组 
st.pop(); //栈顶元素出栈 
} 
for (i = j - 1; i >= 0; i--) 
{ 
cout << ch[i]; //逆序打印ch数组里的的元素 
st.push(ch[i]);//元素逆序入栈 
} 
} 
int find(char c, char array[], int n)//在array数组中查找字符c 
{ 
int i; 
int flag = 0; 
for (i = 0; i < n; i++) 
{ 
if (c == array[i]) 
flag = 1; 
} 
return flag; 
} 
int location(char c, char array[])//在array数组中查找字符c,若查找成功返回字 
//符c的下标 
{ 
int i; 
for (i = 0; c != array[i]; i++); 
return i; 
} 
void error()//打印程序出错信息 
{ 
cout << " error!" << endl; 
}
void analyse(char Vn[], char Vt[], string M[5][6], string str) 
{ 
int i, j, p, q, h, flag = 1; 
char a, X; 
stack<char> st; 
st.push('#');//‘#’入栈。 
st.push(Vn[0]);//Vn[0]入栈 
j = 0; 
//j指向输入串的指针 
h = 1; 
a = str[j]; 
cout << "步骤 " << "分析栈 " << "剩余输入串 " << "所用产生式" << endl; 
while (flag == 1) 
{ 
cout << h << " ";//显示步骤 
h++; 
showstack(st); //显示分析栈中内容 
cout << " "; 
for (i = j; i < str.size(); i++) 
cout << str[i]; //显示剩余字符串 
X = st.top(); 
if (find(X, Vt, LENVt) == 1) 
if (X == a) //分析栈的栈顶元素和剩余输入串的第一个元素相较 
if (X != '#') 
{ 
cout << " " << X << "匹配" << endl; 
st.pop(); 
a = str[++j]; 
//读入输入串的下一个字符 
} 
else 
{ 
cout << " " << "接受!" << endl << endl; 
flag = 0; 
} 
else 
{ 
error(); 
break; 
} 
else{ 
for (p = 0; p < sizeof(Vn); p++){
if(X == Vn[p]){
break;
}
}
//实现下标的转化(非终结符转换为行下标) 
for(q = 0; q < LENVt; q++){
if(a == Vt[q]){
break;
}
}
//实现下标的转化(终结符转换为列下标) 
string S1("NULL"), S2("null"); 
if (M[p][q] == S1 || M[p][q] == S2) 
//查找二维数组中的产生式 
{ 
error(); 
break; //对应项为空,则出错 
} 
else 
{ 
string str0 = M[p][q]; 
cout << " " << X << "-->" << str0 << endl; //显示相应生式 
st.pop(); 
if (str0 != "$") //$代表“空”字符 
for (i = str0.size() - 1; i >= 0; i--){ 
st.push(str0[i]);
}
//产生式右端逆序进栈 
} 
} 
} 
} 
int main() 
{ 
string M[5][6] = { "Te","NULL","NULL","Te","NULL","NULL", 
"NULL","+Te","NULL","NULL","$","$", 
"Ft","NULL","NULL","Ft","NULL","NULL", 
"NULL","$","*Ft","NULL","$","$", 
"i","NULL","NULL","(E)","NULL","NULL" 
};//预测分析表 
string str; 
int errflag, i; 
cout << "文法:E->E+T|T T->T*F|F F->(E)|i" << endl; 
cout << "请输入分析串(以#结束):" << endl; 
do 
{ 
errflag = 0; 
cin >> str; 
for (i = 0; i < str.size(); i++)if (!find(str[i], Vt, LENVt)) 
{ 
cout << "输入串中包含非终结符" << str[i] << "(输入错误)!" << endl; 
errflag = 1; 
} 
} while (errflag == 1); 
analyse(Vn, Vt, M, str); 
return 0; 
}

五、实验结果

正确识别:

在这里插入图片描述

错误识别:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 引言 当今信息技术领域日新月异&#xff0c;各种新技术和新平台层出不穷。鸿蒙&#xff08;HarmonyOS&#xff09;、Flutter、以及车载应用开发…

Cell-在十字花科植物中年生和多次开花多年生开花行为的互相转化-文献精读21

Reciprocal conversion between annual and polycarpic perennial flowering behavior in the Brassicaceae 在十字花科植物中年生和多次开花多年生开花行为的互相转化 亮点 喜马拉雅须弥芥 和 内华达糖芥 是两个多年生植物模型 MADS-box 基因的剂量效应决定了一年生、二年生…

树莓派4B 零起点(一) 树莓派 无屏 从购买到启动

目录 背景 一. 准备工作 二、烧录系统 三、连接系统 背景 准备开发ROS机器人&#xff0c;在淘宝上购买的树莓派4B(4G)到货了&#xff0c;配件都很齐全&#xff0c;那么就直接开箱验货。 一. 准备工作 1 、硬件&#xff1a;(如下图) (我的购买链接: 树莓派4B 4g 套件) 2…

信号:干扰类别及特征提取(二)

目录 第二部分&#xff1a;特征提取 一&#xff1a;瞬时特征参数 1.零中心归一化瞬时幅度之谱密度的最大值 2.非弱信号段零中心归一化瞬时幅度的标准偏差 3.零中心归一化瞬时幅度绝对值的标准偏差 4.零中心归一化非弱信号段瞬时频率的标准偏差 5.零中心归一化非弱信号段…

OpenCV学习 基础图像操作(十七):泛洪与分水岭算法

原理 泛洪填充算法和分水岭算法是图像处理中的两种重要算法&#xff0c;主要用于区域分割&#xff0c;但它们的原理和应用场景有所不同&#xff0c;但是他们的基础思想都是基于区域迭代实现的区域之间的划分。 泛洪算法 泛洪填充算法&#xff08;Flood Fill&#xff09;是一…

【Autopilot】没有自动添加本地管理员的问题处理

【问题】某公司选用了D记的笔记本电脑&#xff0c;约定出厂就预配置好Autopilot&#xff0c;当时向D记提供了三个信息&#xff1a; 1. M365的租户ID 2. 公司域名信息 3. Group Tag (某公司为跨国公司&#xff0c;通过Group Tag来区分国家&#xff0c;比如CHN-中国&#xff0c;L…

【模拟-BM99 顺时针旋转矩阵】

题目 BM99 顺时针旋转矩阵 描述 有一个NxN整数矩阵&#xff0c;请编写一个算法&#xff0c;将矩阵顺时针旋转90度。 给定一个NxN的矩阵&#xff0c;和矩阵的阶数N,请返回旋转后的NxN矩阵。 分析 模拟&#xff0c;写几个样例&#xff0c;分析一下新矩阵元素下标与原矩阵元素…

前端工程化:基于Vue.js 3.0的设计与实践

这里写目录标题 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍引言本书概述主要内容作者简介为什么选择这本书&#xff1f;结语 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍 够买连接—>https://item.jd.com/13952512.html 引言 在前端技术日…

17、matlab实现均值滤波、中值滤波、Butterworth滤波和线性相位FIR滤波

1、创建信号 1&#xff09;创建正余弦信号、噪声信号和混合信号 原始正余弦信号公式&#xff1a;Signal1 sin(2*pi*20* t) sin(2*pi*40* t) sin(2*pi*60* t) 高斯分布的白噪声&#xff1a;NoiseGauss [randn(1,2000)] 均匀分布的白噪声&#xff1a;[rand(1,2000)] 正余弦…

k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)HPA详细解释与案例应用

文章目录 前言HPA简介简单理解详细解释HPA 的工作原理监控系统负载模式HPA 的优势使用 HPA 的注意事项应用类型 应用环境1.metircs-server部署2.HPA演示示例&#xff08;1&#xff09;部署一个服务&#xff08;2&#xff09;创建HPA对象&#xff08;3&#xff09;执行压测 前言…

278 基于Matlab GUI的中重频PD雷达仿真系统

基于Matlab GUI的中重频PD雷达仿真系统。具有26页文档报告。仿真雷达信号的发射、传播、散射、接收、滤波、信号处理、数据处理的全部物理过程&#xff0c;因此应当实现对雷达发射机、天线、接收机、回波信号处理、数据处理的建模与仿真。程序已调通&#xff0c;可直接运行。 2…

自定义类型:结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

使用Qt实现文本文件的读写操作

文章目录 文本读写简介QFileDialog简介常用方法示例代码 QFile简介常用方法示例代码 QTextStream简介常用方法示例代码 结合使用示例完整示例代码(读写操作&#xff0c;可直接复制运行我使用的Qt版本为QT5.14)mainwindow.hmainwindow.cppmain.cpp代码解释 文本读写简介 在现代…

编译原理-词法分析(实验 C语言)

编译原理-词法分析 1. 实验目的 设计、编写并调试一个词法分析程序&#xff0c;加深对词法分析原理的理解 2. 实验要求 2.1 待分析的简单语言的词法 关键字&#xff1a;begin&#xff0c;if&#xff0c;then&#xff0c;while&#xff0c;do&#xff0c;end 所有关键字都是…

uc_os操作练习

目录 一、CubeMX配置 二、获取uc-os源码 三、代码移植 四、代码修改 五、总结 六、参考资料 一、CubeMX配置 首先进入CubeMX&#xff0c;&#xff0c;新建工程&#xff0c;选择STM32F103C8T6芯片&#xff0c;照例配置好RCC和SYS。 然后配置GPIO输出&#xff0c;这里选择P…

HarmonyOS(二十三)——HTTP请求实战一个可切换的头条列表

在前一篇文章&#xff0c;我们已经知道如何实现一个http请求的完整流程&#xff0c;今天就用官方列子实战一个简单的新闻列表。进一步掌握ArkTS的声明式开发范式&#xff0c;数据请求&#xff0c;常用系统组件以及touch事件的使用。 主要包含以下功能&#xff1a; 数据请求。…

matplotlib 动态显示梯度下降过程

文章目录 简介曲线下降曲面下降 简介 梯度下降是一种优化算法&#xff0c;常用于寻找函数的最小值或最大值。它通过迭代更新参数的方式逐步减小&#xff08;或增大&#xff09;目标函数的值&#xff0c;直到达到某个停止条件为止。梯度下降的基本思想是沿着目标函数的负梯度方…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作&#xff1a;SD卡烧录工具入门书籍推荐&#xff1a;BeagleBone cookbookBeagleBone概况&#xff1f; 重要路径 官方例程及脚本路径&#xff1a;/var/lib/cloud9 系统镜像下载 疑问&am…

电子设计教学新篇章:SmartEDA引领学校教学升级风潮

在数字化时代的浪潮中&#xff0c;电子设计教学领域正迎来一场革命性的变革。SmartEDA&#xff0c;作为电子设计课程的新宠&#xff0c;以其高效、智能的特性&#xff0c;正成为学校教学升级的重要推手。它不仅极大地提升了电子设计的效率&#xff0c;还为学生们带来了更为深入…

TOGAF数字化转型的关键(文尾附在线TOGAF免费测试)

业务架构驱动数据架构和应用架构的设计&#xff0c;而应用架构又依赖于数据架构和技术架构的支持。技术架构则为整个架构提供了稳定的基础设施。 在数字化转型中&#xff0c;协调和整合这四种架构是至关重要的。通过确保它们之间的一致性和协同工作&#xff0c;可以实现企业业务…