设计简单算数表达式语法分析器算法(LR来实现)

2023-11-19

#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
char L[20] = "i+-*/()#ETF";//判断依据
int search(char c)//对应列寻找
{
	int i = 0;
	while (L[i] != '\0')
	{
		if (c == L[i])
			return i;
		i++;
	}
	if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9')
	{
		return 0;
	}
	return -1;

}
int toTen(string s)
{
	int num = 0;
	int i = 1;
	while (s[i] != '\0')
	{
		num = num * 10 + s[i] - '0';
		i++;
	}
	return num;
}
int main()
{
	//分析表
	string LR[16][12] = {
		//i      +     -     *     /      (      )     #       E    T    F
		{"s1","null","null","null","null","s5","null","null","s2","s3","s4"},
		{"null","r8","r8","r8","r8","null","r8","r8","null","null","null"},
		{"null","s6","s7","null","null","null","null","acc","null","null","null"},
		{"null","r3","r3","s8","s9","null","r3","r3","null","null","null"},
		{"null","r6","r6","r6","r6","null","r6","r6","null","null","null"},
		{"s1","null","null","null","null","s5","null","null","s15","s3","s4"},
		{"s1","null","null","null","null","s5","null","null","null","s13","s4"},
		{"s1","null","null","null","null","s5","null","null","null","s14","s4"},
		{"s1","null","null","null","null","s5","null","null","null","null","s11"},
		{"s1","null","null","null","null","s5","null","null","null","null","s10"},
		{"null","r5","r5","r5","r5","null","r5","r5","null","null","null"},
		{"null","r4","r4","r4","r4","null","r4","r4","null","null","null"},
		{"null","r7","r7","r7","r7","null","r7","r7","null","null","null"},
		{"null","r1","r1","s8","s9","null","r1","r1","null","null","null"},
		{"null","r2","r2","s8","s9","null","r2","r2","null","null","null"},
		{"null","s6","s7","null","null","null","s12","null","null","null","null"}
	};
	stack<int>status;//状态栈
	stack<char>letter;//符号栈
	status.push(0);
	letter.push('#');
	int len[10] = { 0,3,3,1,3,3,1,3,1 };//1-8号文法每个文法长度
	char head[20] = { 'S','E','E','E','T','T','T','F','F' };


	string str;
	cin >> str;//读入一段算术表达式
	str += '#';//在末尾加上结束标识符
	int index = 0;
	while (index < str.length())
	{
		int column = search(str[index]);
		if (LR[status.top()][column][0] == 's')//移进
		{
			int st1 = toTen(LR[status.top()][column]);
			status.push(st1);//状态入栈
			letter.push(str[index]);//符号入栈
		}
		else if (LR[status.top()][column][0] == 'r')//规约
		{
			while (LR[status.top()][column][0] == 'r')//若继续规约
			{
				int st1 = toTen(LR[status.top()][column]);//规约表达式序号
				char ch = head[st1];//规约所得符号
				int st2 = len[st1];//规约表达式长度
				for (int i = 0; i < st2; i++)//状态和符号出栈
				{
					status.pop();
					letter.pop();
				}
				letter.push(ch);//将规约符号入栈
				int col = search(ch);//找到规约符号对应列
				status.push(toTen(LR[status.top()][col]));//将规约符号对应的状态入栈
			}
			if (LR[status.top()][column] == "acc")//结束标志
			{
				cout << endl << "true";
				break;
			}
			else if(LR[status.top()][column][0] == 's')//移进标志
			{
				letter.push(str[index]);//符号入栈
				status.push(toTen(LR[status.top()][column]));//对应状态入栈
			}
			else//错误
			{
				cout << endl << "false" << endl;
				break;
			}
			
		}
		else if ((LR[status.top()][column] == "acc"))
		{
			cout <<endl<< "true" ;
			break;
		}
		else
		{
			cout <<endl<< "false";
			break;
		}
		index++;
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计简单算数表达式语法分析器算法(LR来实现) 的相关文章

  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • C# 3 新功能帖子(与 .Net 3.5 功能无关)[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Net F
  • 如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

    TL DR 如何将 JSON 字符串发送到带有 auth 标头的 REST 主机 我尝试了 3 种不同的方法 发现一种适用于匿名类型 为什么我不能使用匿名类型 我需要设置一个名为 Group Name 的变量 并且连字符不是有效的 C 标识
  • 要实现 XML 可序列化,从 ICollection 继承的类型必须具有 Add 的实现

    我有来自现有项目的 CSLA 1 x 框架 对象 我试图在新的 Net 4 0 项目中使用它 这些对象正在生产中使用 如果没有 2 组对象 我确实无法将它们转换为 2 x 或 EF 在我的 c webservice 中 当我尝试运行它时 我
  • 隐藏树视图列表中的节点。在 C# 中

    我正在使用 VS 2005 C 正在处理一个未完成的 WinForm 我已将 XML 解析为树视图列表 但遇到了一些问题 我想知道是否有一种方法可以隐藏 过滤 删除名称中包含 this text 的某个节点 而不必依赖文本框 这就是我对这个
  • 根据值更改 DataGrid 单元格颜色

    我有一个 WPF 数据网格 我想要根据值使用不同的单元格颜色 我的 xaml 上有以下代码 Style TargetType DataGridCell 但不是只选择一个单元格而是选择所有行 我缺少什么 如果您尝试设置DataGrid Cel
  • 为什么编译器不对同一翻译单元中的 ODR 违规发出警告

    在同一个翻译单元中 ODR 问题很容易诊断 那么为什么编译器不会针对同一翻译单元中的 ODR 违规发出警告呢 例如在下面的代码中https wandbox org permlink I0iyGdyw9ynRgny6 https wandbo
  • const int 列表而不是 enum

    我开始研究大型 C 代码库 并发现使用带有多个 const ints 字段的静态类 这个类的行为与枚举完全一样 我想将类转换为实际的枚举 但权力被拒绝 我想转换它的主要原因是这样我可以将枚举作为数据类型而不是 int 这对可读性有很大帮助
  • 如何将 Activator.CreateInstance 与字符串一起使用?

    在我的反射代码中 我的通用代码部分遇到了问题 特别是当我使用字符串时 var oVal object Test var oType oVal GetType var sz Activator CreateInstance oType oVa
  • 了解C/C++中函数调用的堆栈框架? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我也是 C C 和汇编语言的新手 这
  • 如何在调试时轻松查看事件订阅数量?

    在调试时 我可以查看一下textBox1 TextChanged查看事件订阅数量 如果是 那么我该如何钻取它 我需要知道在给定时间有多少订阅进行调试 因为看起来一个事件被多次触发 但我怀疑这个错误确实是因为textBox1 TextChan
  • CGAL:如何有效计算多面体的面面积?

    我有一个多面体 其面是三角形 我知道在 CGAL 中 Triangle 3 类提供了 squared area 方法 通过它我们可以计算三角形的面积 有什么方法可以将其应用到多面体方面吗 或者关于如何计算每个面的面积有什么想法吗 这是一个例
  • 计算距离早上 8 点还有多少小时

    我知道如何计算两个日期之间的差异 但如何计算给定日期与下一个上午 8 点之间的时间 var now DateTime Now var tomorrow8am now AddDays 1 Date AddHours 8 double tota
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • C# 多重继承

    目前我正在学习 C 和 ASP NET MVC 4代码优先方法 我是 Visual Basic 开发人员 现在我想开始 C 而且 现在我遇到了必须管理多重继承的情况 但是 对于Class i来说这是不可能的 那么 我应该如何管理我拥有的这些
  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上

随机推荐

  • 字符编码悉知

    1 查看windows系统代码页 代码页是字符集编码的别名 也有人称 内码表 早期 代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称 当时通用的操作系统都是命令行界面系统 这些操作系统直接使用BIOS供应的VGA功能来显示字符 操作
  • BrokenPipeError: [Errno 32] Broken pipe

    运行Pytorch tutorial代码报错 BrokenPipeError Errno 32 Broken pipe 源代码地址 Training a classifier CIFAR10 该问题的产生是由于windows下多线程的问题
  • QMap遍历(修改)

    方法一 STL风格的遍历器 个人较常用 直观易读 方便修改值 QMap
  • 解决 MDK keil 注册中出现 TOOLS.INI TOOLCHAIN NOT INSTALLED 办法

    MDK Keil 兼容 C51 Keil 我们的电脑有32位系统和64位系统 当keil出现这个错误时 可以按以下办法解决 有两种解决办法 第一种 同时安装MDK Keil 和 C51 Keil 有可能解决此问题 安装必须路径相同 第二种
  • leetcode-合并两个有序链表(详解)

    合并两个有序链表 前言 一 题链接 题意 题思路 题思路图解 题代码 总结 前言 路漫漫及修远兮 一 题链接 题意 将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的 输入 l1 1 2 4 l2
  • 【车道线】TwinLiteNet 复现过程全纪录

    码字不易 喜欢的请点赞收藏 论文全文翻译 freespace TwinLiteNet An Efficient and Lightweight Model for Driveable Area and Lane Segmentation 莫
  • 虹软人脸识别 - ArcFace SDK介绍及使用注意事项

    很多朋友在开发人脸识别系统的时候 会遇到各种各样的问题 现在我们以安卓平台使用虹软的免费离线人脸识别SDK开发为例 给大家介绍一下如何开发一个带有图片的人脸检测 视频画面的人脸属性检测 人脸注册识别等功能的人脸识别系统 一 获取SDK 1
  • [rk3588]多种wifi模组兼容

    硬件部分 M 2接口 使用的wifi模组是PCIE接口的RTL8852BE和SDIO接口的AP6256 软件部分 M 2接口介绍 M 2接口是一种用于连接各种扩展设备的接口标准 它最初设计用于连接固态硬盘 SSD 但也广泛用于连接其他设备
  • spark hadoop环境及运行

    hadoop配置 在Ubuntu20 04里安装Hadoop详细步骤 图文 亲测成功 ubuntu20 04安装hadoop 菜鸡的学习之路的博客 CSDN博客 启动hadoop root ubuntu usr local hadoop s
  • 服务器处理发生异常:java.text.ParseException: Unparseable date

    测试上传报文的时候遇见报错 服务器处理发生异常 java text ParseException Unparseable date 2023 03 03 错误报文 实际需要的报文 错误原因 上传时间字段 与Date字段数据位数不匹配 Jav
  • python贝叶斯网络预测模型_高效灵活的概率建模方法基于Python

    前言 在今天给大家介绍一个研究工具 pomegranate 它比其他软件包更加灵活 更快 直观易用 并且可以在多线程中并行完成 The API 主要模型介绍一般混合模型 隐马尔可夫模型 贝叶斯网络 贝叶斯分类器 所有模型使用做多的方法 mo
  • 迪杰斯特拉(Dijkstra)算法求最短路径

    文章目录 一 最短路径 二 基本思想 三 步骤图解 步骤 S中存放的是已经求得的最短路径的终点的集合 v s集合包含其他点 i代表第i条最短路径 及可能路径走法 邻接矩阵表示弧 一 最短路径 从某顶点 源点 出发到另一顶点 目的地 的路径中
  • 【数据挖掘】数据挖掘比赛项目-kaggle泰坦尼克号

    数据挖掘实战项目 kaggle泰坦尼克号生还者预测 ing kaggle泰坦尼克号生还者预测 泰坦尼克号 从灾难中学习机器 kaggle网站连接 链接 https www kaggle com c titanic 一 实战项目描述 1 项目
  • uniapp判断h5运行环境(微信、pc、移动端)

    isOpenMode 平台 设备和操作系统 var system win false mac false xll false ipad false 检测平台 var p navigator platform system win p ind
  • 文件内存映射mmap解决大文件快速读写问题

    转自 http blog csdn net gulaizi article details 6325726 mmap函数主要用途有三个 1 将一个普通文件映射到内存中 通常在需要对文件进行频繁读写时使用 这样用内存读写取代I O读写 以获得
  • 5、Ubuntu20常用操作_进程管理&重定向和管道&常用命令&网络管理&构建web静态服务器nginx

    进程管理 进程的概念 大家比较熟悉 Windows 下的可执行文件 就是那些扩展名为exe的文件 大家知道 只需要鼠标双击这些程序 就可以运行了 程序运行起来后 我们把这个程序正在运行的 实例 称之为 进程 操作系统对每个进程都分配一个数字
  • 小程序添加本地图片

    写背景图片的时候用了本地的图片 报错说是不能直接使用本地图片 只能使用
  • 为什么振荡电路晶体旁要放22pF电容?

    振荡电路用于实时时钟RTC 对于这种振荡电路只能用32 768KHZ 的晶体 晶体被连接在OSC3 与OSC4 之间而且为了获得稳定的频率必须外加两个带外部电阻的电容以构成振荡电路 32 768KHZ的时钟晶振产生的振荡信号经过石英钟内部分
  • (ps2019)Photoshop 2019 最新破解版下载

    Photoshop CC 2019新增功能 下载地址点我 新功能介绍 https helpx adobe com cn photoshop using whats new html 经过改良设计的内容识别填充 借助 Adobe Sensei
  • 设计简单算数表达式语法分析器算法(LR来实现)

    include