语法分析!!!

一、实验题目

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

二、实验目的

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

三、实验内容

在这里插入图片描述

四、实验代码

#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.mzph.cn/bicheng/25257.shtml

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

相关文章

隐式链接DLL

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 【例9.5】创建的基于MFC对话框的应用程序MFCImLink2&#xff0c;隐式链接例9.2创建的MFCLibrary2.dll&#xff0c;使用其中的导出函数求正方形的面积。 (1) 使用MFC应用程…

【零基础一看就会】Python爬虫从入门到应用(下)

目录 一、urllib的学习 1.1 urllib介绍 1.2 urllib的基本方法介绍 urllib.Request &#xff08;1&#xff09;构造简单请求 &#xff08;2&#xff09;传入headers参数 &#xff08;3&#xff09;传入data参数 实现发送post请求&#xff08;示例&#xff09; response.…

野火FPGA跟练(四)——串口RS232、亚稳态

目录 简介接口与引脚通信协议亚稳态RS232接收模块模块框图时序波形RTL 代码易错点Testbench 代码仿真 RS232发送模块模块框图时序波形RTL 代码Testbench 代码仿真 简介 UART&#xff1a;Universal Asynchronous Receiver/Transmitter&#xff0c;异步串行通信接口。发送数据时…

微服务开发与实战Day04

一、网关路由 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由、转发、身份校验。 在SpringCloud中网关的实现包括两种&#xff1a; 1. 快速入门 Spring Cloud Gateway 步骤&#xff1a; ①新建hm-gateway模块 ②引入依赖pom.xml(hm-gateway) <?xml version…

解锁俄罗斯市场:如何选择优质的俄罗斯云服务器

在当前云计算市场上&#xff0c;很多大型的云厂商并没有俄罗斯服务器的云节点&#xff0c;这给许多企业在拓展海外业务时带来了一定的困扰。然而&#xff0c;俄罗斯作为一个经济发展迅速的国家&#xff0c;其市场潜力不可忽视。因此&#xff0c;选择一台优质的俄罗斯云服务器成…

【MySQL】(基础篇三) —— 创建数据库和表

管理数据库和表 管理数据库 创建数据库 在MySQL中&#xff0c;创建数据库的SQL命令相对简单&#xff0c;基本语法如下&#xff1a; CREATE DATABASE 数据库名;如果你想避免在尝试创建已经存在的数据库时出现错误&#xff0c;可以添加 IF NOT EXISTS 子句&#xff0c;这样如…

数据结构(C):二叉树前中后序和层序详解及代码实现及深度刨析

目录 &#x1f31e;0.前言 &#x1f688;1.二叉树链式结构的代码是实现 &#x1f688;2.二叉树的遍历及代码实现和深度刨析代码 &#x1f69d;2.1前序遍历 ✈️2.1.1前序遍历的理解 ✈️2.1.2前序代码的实现 ✈️2.1.3前序代码的深度解剖 &#x1f69d;2.2中序遍历 ✈…

计算机网络:数据链路层 - 扩展的以太网

计算机网络&#xff1a;数据链路层 - 扩展的以太网 集线器交换机自学习算法单点故障 集线器 这是以前常见的总线型以太网&#xff0c;他最初使用粗铜轴电缆作为传输媒体&#xff0c;后来演进到使用价格相对便宜的细铜轴电缆。 后来&#xff0c;以太网发展出来了一种使用大规模…

AI菜鸟向前飞 — LangChain系列之十七 - 剖析AgentExecutor

AgentExecutor 顾名思义&#xff0c;Agent执行器&#xff0c;本篇先简单看看LangChain是如何实现的。 先回顾 AI菜鸟向前飞 — LangChain系列之十四 - Agent系列&#xff1a;从现象看机制&#xff08;上篇&#xff09; AI菜鸟向前飞 — LangChain系列之十五 - Agent系列&#…

Springboot使用webupload大文件分片上传(包含前后端源码)

Springboot使用webupload大文件分片上传&#xff08;包含源码&#xff09; 1. 实现效果1.1 分片上传效果图1.2 分片上传技术介绍 2. 分片上传前端实现2.1 什么是WebUploader&#xff1f;功能特点接口说明事件APIHook 机制 2.2 前端代码实现2.2.1&#xff08;不推荐&#xff09;…

计算机组成原理之计算机系统层次结构

目录 计算机系统层次结构 复习提示 1.计算机系统的组成 2.计算机硬件 2.1冯诺依曼机基本思想 2.1.1冯诺依曼计算机的特点 2.2计算机的功能部件 2.2.1MAR 和 MDR 位数的概念和计算 3.计算机软件 3.1系统软件和应用软件 3.2三个级别的语言 3.2.1三种机器语言的特点 3…

★pwn 24.04环境搭建保姆级教程★

★pwn 24.04环境搭建保姆级教程★ &#x1f338;前言&#x1f33a;Ubuntu 24.04虚拟机&#x1f337;VM&#x1f337;Ubuntu 24.04镜像 &#x1f33a;工具&#x1f337;可能出现的git clone错误&#x1f337;复制粘贴问题&#x1f337;攻击&#x1f337;编题 &#x1f33a;美化&…

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构

目录​​​​​​​ 一、引言 二、自动模型类&#xff08;AutoModel&#xff09; 2.1 概述 2.2 Model Head&#xff08;模型头&#xff09; 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预…

使用 Keras 的 Stable Diffusion 实现高性能文生图

前言 在本文中&#xff0c;我们将使用基于 KerasCV 实现的 [Stable Diffusion] 模型进行图像生成&#xff0c;这是由 stable.ai 开发的文本生成图像的多模态模型。 Stable Diffusion 是一种功能强大的开源的文本到图像生成模型。虽然市场上存在多种开源实现可以让用户根据文本…

【会议征稿,IEEE出版】第三届能源与电力系统国际学术会议 (ICEEPS 2024,7月14-16)

如今&#xff0c;全球能源行业正面临着前所未有的挑战。一方面&#xff0c;加快向清洁、可再生能源转型是遏制能源环境污染问题的最佳途径之一&#xff1b;另一方面&#xff0c;电力系统中新能源发电、人工智能技术、电力电子装备等被广泛应用和期待&#xff0c;以提高能源可持…

transformer - 注意力机制

Transformer 的注意力机制 Transformer 是一种用于自然语言处理任务的模型架构&#xff0c;依赖于注意力机制来实现高效的序列建模。注意力机制允许模型在处理一个位置的表示时&#xff0c;考虑输入序列中所有其他位置的信息&#xff0c;而不仅仅是前面的几个位置。这种机制能…

ATTCK红队评估(五)

环境搭建 靶场拓扑图&#xff1a; 靶机下载地址: 漏洞详情 外网信息收集 确定目标靶机地址&#xff1a; 发现主机192.168.135.150主机是本次攻击的目标地址。探测靶机开放的端口信息&#xff1a; 目标靶机开放了两个端口&#xff1a;80、3306&#xff0c;那没什么意外的话就是…

每天壁纸不重样~下载必应每日图片

下载必应每日图片 必应不知道你用过没有你下载过必应的图片没有你又没搜索过桌面图片你是不是安装过桌面图片软件你是不是为找一个好看的图片下载过很多桌面软件 必应每日图片 必应每天都会有一张不同的风景图片&#xff0c;画质清晰&#xff0c;而且不收费可以下载使用 但…

重生之我要精通JAVA--第八周笔记

文章目录 多线程线程的状态线程池自定义线程池最大并行数多线程小练习 网络编程BS架构优缺点CS架构优缺点三要素IP特殊IP常用的CMD命令 InetAddress类端口号协议UDP协议&#xff08;重点&#xff09;UDP三种通信方式 TCP协议&#xff08;重点&#xff09;三次握手四次挥手 反射…

sqlmap直接嗦 dnslog注入 sqllibs第8关

dnslog注入是解决注入的时候没有回显的情况&#xff0c;通过dns外带来进行得到我们想要的数据。 我们是用了dns解析的时候会留下记录&#xff0c;这时候就可以看见我们想要的内容。 这个时候我们还要了解unc路径以及一个函数load_file()以及concat来进行注入。看看我的笔记 unc…