语法分析!!!

一、实验题目

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

二、实验目的

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

三、实验内容

在这里插入图片描述

四、实验代码

#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; 
}

五、实验结果

正确识别:

在这里插入图片描述

错误识别:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch hanlp插件自定义分词配置(停用词)

[Toc](elasticsearch hanlp插件自定义分词配置(停用词)) 既然可以自定义关键词&#xff0c;那么自然也是可以自定义停用词的。 背景 由于在使用elasticsearch hanlp(以下简称es hanlp)的过程中&#xff0c;分词会出现一些无用的词&#xff0c;比如各种标点符号或者没有意义的…

二叉排序树--c++

【相关知识】 二叉排序树&#xff08;也称二叉查找树&#xff09;&#xff1a;或者是一棵空的二叉树&#xff0c;或者是具有下列性质的二叉树&#xff1a; ⑴ 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于根结点的值&#xff1b; ⑵ 若它的右子树不空&#xff0c…

vivado HW_BITSTREAM、HW_CFGMEM

HW_比特流 描述 从比特流文件创建的硬件比特流对象hw_bitstream&#xff0c;用于关联 在Vivado的硬件管理器功能中使用硬件设备对象hw_device 设计套件。 比特流文件是从具有write_bitstream的放置和路由设计创建的 命令硬件位流对象是使用 create_hw_bitstream命令&#xff0c…

【Vue】vuex 的使用 - 创建仓库

通用的地方我们一般会称之为仓库 1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex32.新建 store/index.js 专门存放 vuex ​ 为了维护项目…

vue2中如何使用函数式组件

vue2 中如何使用函数式组件 用 render 定义函数式组件如何处理 props如何在函数式组件中触发自定义事件&#xff1f;injection如何使用 computed 和 methods定义一个函数式组件的 MyButton函数式组件有何优势哪种场景适合使用函数式组件函数式组件的问题参考 函数式组件&#x…

MySQL-相关日志

官方文档 1、MySQL支持的日志 MySQL有不同类型日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分别为 二进制日志、错误日志、通用查询日志、慢查询日志、中继日志、数据定义语句日志 慢查询日志&#xff1a;记录所有执行时间超过 long_query_time的所有查询&#xf…

【 技术栈】技术方案到底怎么写?

文章目录 一、背景二、技术方案重要性三、常见的技术方案有哪些内容1、系统用例2、功能整体链路2.1、核心业务流程 3、数据库设计4、接口设计5、非功能设计5.1、性能与稳定性5.2、监控 7、系统风险点评估 四、总结 一、背景 工作中&#xff0c;有一些需求或者技术改造&#xf…

前端开发高频面试题

好的&#xff0c;以下是对您提出的问题的详细回答&#xff1a; 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; Vue中动态权限绑定渲染列表通常涉及以下步骤&#xff1a; 首先&#xff0c;通过API请求从服务器获取当前用户的权限数据。在Vue组件中&#xff…

uc/OS移植到stm32实现三个任务

文章目录 一、使用CubeMX创建工程二、uc/OS移植三、添加代码四、修改代码五、实践结果六、参考文章七、总结 实践内容 学习嵌入式实时操作系统&#xff08;RTOS&#xff09;,以uc/OS为例&#xff0c;将其移植到stm32F103上&#xff0c;构建至少3个任务&#xff08;task&#xf…

[pixi.js] 入门简单案例 简易时钟

老实说pixi虽然之前拿来做个几个简单的游戏&#xff0c;但是是好久前的了&#xff0c;又忘了&#xff0c;现在算是重新入门。 官网版本已经更新到v8去了&#xff0c;而react相关的pixi库pixi-react 虽然支持react18 但还是v6-v7的版本&#xff0c;既然已经看了v8的文档&#xf…

Web 版 | 开源数据库设计软件 | drawdb

文章目录 简介快速运行方式 1:本地运行方式 2:Docker 构建并运行方式 3:Docker 运行参考🚀 目标: 安装一个 Web 版本的 ER 图设计软件! 👉 GitHub: https://github.com/drawdb-io/drawdb 【11.7k ⭐】 简介 DrawDB:Free, simple, and intuitive database design …

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…

Idea解决堆栈溢出

废话不说了&#xff0c;这问题搞了我两天&#xff0c;最近在用内网办公&#xff0c;没用公网&#xff0c;所以博客暂时没更新

堆排序-调整算法

个人主页点这里!~ 1.堆 了解堆排序首先要了解一下堆这个数据结构 堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;它通常被表示为一个完全二叉树或近似完全二叉树&#xff0c;并且满足堆性质&#xff08;Heap Property&#xff09;。堆主要分为两种&…

wordpress主题导航主题v4.16.2哈哈版

1.下载授权接口源码onenav-auth-api-v2.zip &#xff0c;在宝塔新建一个网站&#xff0c;域名为 auth.iotheme.cn&#xff0c;设置wordpress伪静态&#xff0c;申请ssl证书。将上面源码解压后上传到此网站根目录。 2. 在宝塔根目录etc下 hosts 中添加 127.0.0.1 auth.iotheme.…

Docker配置Redis集群以及主从扩容与缩容

基础镜像拉取 docker run -p 6379:6379 -d redis:6.0.8 配置文件以及数据卷挂载 # 开启密码验证&#xff08;可选&#xff09; requirepass 1234 # 允许redis外地连接&#xff0c;需要注释掉绑定的IP # bind 127.0.0.1 # 关闭保护模式&#xff08;可选&#xff09; protected-m…

13、SpringBoot 源码分析 - 自动配置深度分析六

SpringBoot 源码分析 - 自动配置深度分析六 refresh和自动配置大致流程AutoConfigurationImportSelector的fireAutoConfigurationImportEvents通知自动配置导入事件AutoConfigurationGroup的selectImports封装成Entry返回MyAutoConfiguration自动配置类创建META-INF文件夹和文件…

CST纳米光学 --- LSPR局部等离子激元共振,消光截面ECS,法诺共振

这期我们用自带的Drude散射粒子&#xff0c;计算消光截面。 查看模型&#xff0c;内核是Silica二氧化硅&#xff0c;正常的介质材料&#xff0c;半径是38纳米&#xff1a; 外围是Drude模型的金属材料包裹&#xff0c;半径48纳米&#xff0c;该材料的参数可由宏Materials->Cr…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…

代码随想录算法训练营第四十九天 | 139.单词拆分、多重背包、背包问题总结

139.单词拆分 视频讲解&#xff1a; 动态规划之完全背包&#xff0c;你的背包如何装满&#xff1f;| LeetCode&#xff1a;139.单词拆分_哔哩哔哩_bilibili 代码随想录 解题思路 1.dp[i] 字符串的长度为i&#xff0c;dp[i]是否可以被组成 2.递推公式 if( [j,i] && d…