也谈表达式分析和计算

前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码 大雾 广东人· 大雾穷横孤儿提供2398奋斗过于·1fwojei9fhgbuij李的萨科技发挥·khfbadlq穿梭在大城市的过程流程是肯定会牛逼出门时刻都回家初始模板和吃吗上课的破壁吃吗搜的看吹牛逼吃吗,搜谱大V南京m从吧水电费出生地 ... 阅读详情

昨天看到 王博炜 Blog中《五进制》这 篇文章。其中关于5进制到10进制的转换自然没有什么意思,这篇文章给的代码主要是讨论如何进行表达式分析和计算的。作者自制了一个Stack,并且用其 形成了两个堆栈分别用于存储数值和运算符。比较典型的表达式处理的方法。从实现上看,代码有些臃肿,而且必要的优化很少,另外就是没有充分利用标准提供的 便利。比如那个Stack完全没有必要自制,STL提供的std::stack<T>可以很好的完成任务。

而今天我要做的 是,使用boost::spirit来实现同样的表达式分析和计算。众所周知,boost是C++中质量很高的库,被称为准标准库,因为其存在的一个很重 要的目的就是为下一代C++库提供预案。目前已经有大量的boost库成为了C++标准库的一部分。我现在要用的是Boost的Spirit库。这个库可以直接在C++代码中撰写EBNF。学过编译原理的朋友应该对此都很熟悉,这是一种比堆栈更灵活的解析表达式甚至程序的方式。

如果我们要处理四则运算的表达式,那么我们只需要在C++中写入下列EBNF的定义:

 

 

我们就构成了这个表达式的格式定义,它可以很轻松的处理下列表达式的运算:

 

 

很简单吧?

使用过yacc或者*lex的朋友对这类定义肯定很熟悉。但是所不同的是,他们都是让用户写一个模板,然后用yacc或者*lex处理模板生成相应语言的程序。程序臃肿且很难阅读。而且由于不是自己写的程序,调整起来总要经过一步手续,比较繁琐。

而 使用C++的朋友则不用有这种烦恼,Boost的Spirit充分利用了C++强大的语法功能。我们可以直接在程序中写入上述的表达式定义,然后我们的程 序就支持这些表达式的处理了。不需要任何额外的程序处理。所需要的仅仅是include一些头文件而已。是的,仅仅是include一些头文件。不要担心 需要安装什么额外的东西,或者需要链接什么库,因为Spirit的实现完全是头文件组成的,我们不需要链接任何库。把boost的头文件路径放到编译期 中,直接编译就ok了。很轻巧。

下面就是我用Boost Spirit实现的四则运算表达式的代码,由于我的重点是表达式的解析和计算,因此我没有特别处理五进制到十进制的转换问题。但是添加起来显然不麻烦。我 只给出了一个五进制整数部分的输出。如果表达式出错,可以直接用箭头指出哪里有错。很方便调试:) 而且代码量是原文章的五分之一。编译后也仅仅是35KB,也不是很臃肿的。

大家多了解标准库,多了解Boost,C++的编码也是很有趣味的。

 

 

运行结果如下:

 

利用栈计算表达式的值 假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式,求算术表达式值。 过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式求值。   1)将算术表达式exp转换成后缀表达式postexp;   2)对后缀表达式postexp求值。 中缀表达式a*b+c变成后缀表达式是ab*c+ (1)中缀表达式转换成后缀表达式: a 阅读详情

相关推荐

视差和深度分析与计算

我们先来看opencv给出的一个教程[http://docs.opencv.org/3.1.0/dd/d53/tutorial_py_depthmap.html]里面对概念的说明。先看下面这张图:   通过这张图,我们得出视差的计算表达式为: disparity=x−x′=BFZdisparity=x-x^{'}=\frac{BF}{Z}   其中xx和x′x^{'}对应的是场景中的3D点

Linear_Luo的专栏 1万+

小试牛刀-递归下降算法(3)

欢迎关注公众号《后台开发探索之旅》。 递归 递归从表面上看是函数的循环调用,比如函数func1内部又调用了func1,第一个func1压栈后,再将第二个func1压栈,如此反复下去,形成一个类似于数据结构的stack效果,因此基于堆栈的算法可以用递归模拟实现。但实质上,递归具有很抽象的数学思维,常用于降低问题规模。 举个例子,计算数字1到5的全部排列,这个问题有专门的数学理...

猫哥 1879

【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析

关于活跃变量与可用表达式的分析。

记录学习痕迹的公众号:Piper蛋窝 9854

表达式计算: 分析与设计

作者介绍:刘源, 软件工程师, 上海复旦光华电信部 问题由来 在我做过的一个针对网络设备和主机的数据采集系统中,某些采集到的数据需要经过一定的计算后才保存入库,而不是仅仅保存其原始值。为了提供给用户最大的灵活性,我设想提供一个用户界面,允许用户输入计算表达式(或者称为计算公式)。这样,除了需要遵从少量的规则,用户可以得到最大的灵活性。 这样的表达式具有什么特点呢?它一般不是纯的可立即计算

乘风破浪 1608

语法分析实现--表达式解析

语法分析实现 1. 目标及代码 目标: 实现表达式的语法树构建(加减乘除的表达式解析) 如: 将 a = 1+2*5等表达式解析为语法树的形式 代码地址: git代码仓库 注意: 本文章主要目的是记录个人学习历程,如有不对的地方欢迎大家评论指出 2. 语法分析阶段做什么? 语法分析阶段主要的功能就是把词法分析的结果构建一颗语法树, 此法阶段就相当于找到了一个一个的单词而语法阶段要做的就是按照文法规则将这些单词组织起来 此处采用的方法为递归下降法, 文法部分内容太偏数学如果有兴趣可自行搜

sui_feng_piao_guo的博客 6175

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 663

基于算符优先分析方法的表达式语法分析器

文章目录一.题目要求二.设计思想模块一:解析产生式模块二:构建FIRSTVT()和LASTVT()模块三:构建算术优先符号表模块四:表达式语法分析模块五:运算符识别计算三.程序介绍1. 全部函数介绍2. 程序整体执行流程图2. 函数调用关系图3. 程序整体执行结果四.源代码 一.题目要求 根据简单表达式文法构造算符优先分析表 根据构造出的算符优先分析表进行表达式计算 二.设计思想 模块一:解析产生式 功能 把产生式:S->aB解析成VN:S、B,VT:a。 输入约定 这实际上是词法分析的范畴,这

xiaolan7777777的博客 4886

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2977

数据流分析:可用表达式的计算+活跃变量计算+到达定值。

引言 什么是可用表达式和活跃变量?假设有如下代码: int main() { int a=1,b=2,c=1; int x=a+b+b+b+b; int y=a+b+b+b+b; int z=a+b+b+b+b; return 0; } 可用表达式: 举例来说,a+b+b+b+b就是可用表达式,如果不加以优化,其将被计算三次,太浪费了,所以编译优化过程要求发现这个可用表达式。 活跃变量: 举例来说,a,b就是活跃变量,c是不活跃变量,前者叫做live,后者叫做dead。 上面只是直观的理解了以

qq_43391414的博客 2898

从零开始:如何用PSINS工具箱构建你的第一个IMU误差模型

本文详细介绍了如何使用严恭敏教授开发的PSINS工具箱构建IMU误差模型,涵盖从基础参数设置到高级误差建模的全过程。通过imuerrset函数配置陀螺零偏、随机游走等核心参数,并结合实战案例展示消费级MEMS器件的误差建模方法,帮助用户提升惯性导航系统的精度与可靠性。

weixin_29284885的博客 322

手把手教你在VirtualBox里复活Win98,并搞定驱动和文件传输(含资源寻找攻略)

本文详细指导如何在VirtualBox中安装和配置Windows 98,包括驱动安装、文件传输等实用技巧。通过逐步教程和资源寻找攻略,帮助技术爱好者完美复刻这一经典操作系统,满足怀旧或兼容性测试需求。

weixin_29596051的博客 327

前缀、中缀、后缀表达式计算和转化算法详解

前缀、中缀和后缀表达式 概述 前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于数字的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理 如: 中缀表达式:1 + (2 + 3) × 4 - 5 前缀表达式:- + 1 × + 2 3 4 5 后缀表达式:1 2 3 + 4 × + 5 - 中缀表达式是人们最常用的算术表示方法,人脑很容易理解,但对计算机来说很复杂,因为要判断计算的优先级太过繁琐。对计算机来说,计算前缀或后缀表达式的值非常简单。 中缀转换为前缀、后缀 **以 1+(2

博客 5330

Drupal远程代码执行漏洞(CVE-2018-7600)实战复现:从检测到写入WebShell的全过程

本文详细解析了Drupal远程代码执行漏洞(CVE-2018-7600)的实战复现过程,从环境搭建、漏洞检测到WebShell写入的全流程。该高危漏洞影响Drupal 6.x至8.x版本,允许攻击者未经授权执行任意代码。文章提供了多种POC构造方法和高级利用技巧,帮助安全研究人员深入理解漏洞原理并掌握验证技术。

weixin_29322553的博客 275

可用表达式数据流分析

一个表达式。

@fei 964

MacOS多次踩坑后成功安装Homebrew

来一次性成功安装Homebrew吧 官网提供的安装脚本无法成功安装Homebrew,原因大家都懂的,故采用脚本安装的方式。 下载homebrew的安装脚本brew_install 在Download路径下执行如下脚本 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install 修改brew_install脚本 修改brew_install脚本。如果你的脚本打开之后是如下

weixin_41847116的博客 1983

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。WordPress和WordPress plugin都是WordPress基金会的产品。WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的参数转义不充分以及对现有 SQL 查询缺乏充分的准备,很容易通过“type”参数受到 SQL 注入攻击。

失心少年 1383

表达式的计算(后缀表达式的求解)

1. 问题网址:http://lx.lanqiao.cn/problem.page?gpid=T419 问题描述: 问题描述   输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除 输入格式   输入一行,包含一个表达式 输出格式   输出这个表达式的值 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定   表达式长度不超过100,...

二哈 2万+

计算机毕设:线性回归 Xgboost LSTM 预测黄金价格实战 完整代码数据视频讲解 可直接运行

线性回归 Xgboost LSTM 预测黄金价格实战 完整代码数据视频讲解 可直接运行

1761

栈实现前缀表达式的计算

前缀表达式计算,数据结构,栈实现,考研常考算法

小白白O快起来 646

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【C++】B2070 计算分数加减表达式的值

在计算机科学中,处理递推公式或序列的求和问题是常见的考察内容。这类题目不仅考验程序员对循环结构和数学公式的理解,也要求在实现中保证代码的可读性和运行效率。本文以一道经典的分数加减表达式题目为例,详细分析三种实现方法,比较其优劣并提供扩展优化。 我们将详细讲解题目、三种不同的实现方法、优劣对比和优化建议,最后结合代码实现提供更高效的解法。 2024.12.25-✍33min

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 1363

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

使用正则表达式实现表达式计算器

使用正则表达式实现简易表达式计算器 Windows(.NET Framework 2.0) & Windows Mobile (.NET Compact Framework 2.0)

crapex的专栏 9320

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

中序表达式转成前序表达式和后序表达式及其计算方法

举个例子吧:将中序表达式(23+34*45/(5+6+7))转换成后序表达式23 34 45 * 5 6 + 7 + / +   为什么要把它转成后序表达式呢?       当转换成后序表达式后更方便计算表达式的值,如将后序表达式的元素依次进栈直到遇到运算符,这时候从栈中弹出两个元素,再结合运算符计算出这两个数运算的结果(如34*45=1530),将其结果压栈(此时栈元素为23 1530),

dengjianqiang2011的专栏 6883

计算器(表达式计算-后缀表达式实现)

计算器(表达式计算-后缀表达式实现) 【问题描述】 从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出。 要求: 1、表达式运算符只有+、-、*、/,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格; 2、表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式; 3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。 4、要求采用逆波兰表达式来实现表达式计算。

谛凌的博客 2万+

【自用】【数据结构习题 例1】计算表达式

Pri[DIV]就可以获得DIV的优先级union sym 联合体的使用是因为任意输入item,要么是数字要么是符号。后续在进行语义阐释的时候进行具体赋类NUM,OP,EQ,OTHERenum operEPT,ADD,MIN,MUL,DIV,LEFT,RIGHTunion sym// 符号值。

consvain的博客 1844
上一篇: 让VS 2008支持Subversion
DanceFire
博客等级 码龄26年 91粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值