一个简单的公式解析器
为了理解算法中的文法分析,用一个简单的公式解析器来说明。
公式计算是电子表格中的常用功能。主要是实现了些简单的公式计算:
比如:=Sum(A1,A2)
假设我们要实现简单的公式解析,我们从头开始:
分析:
首先,确认采用标准的递归下降法,采用自上而下(预测式)的语法分析(LL方式)。
上下文无关文法(BNF)采用左结合推导树,
下面,也采用由上而下式的进行分析:
1:顶层的文法:
expression -> term expression'
expression' -> add_op term expression'
| minus_op term expression'
| and_op term expression'
add_op -> +
minus_op -> -
and_op -> &
说明:
对于+,-运算,优先级最低,总是最后执行,所以,将其提取为最顶文法。
而 & ,指的是字串连接,作为一个基本补充。如: ="abcd" & "efgh" 结果是: abcdefgh
问题:
将 &与 +,-做为同一优先级,似乎有些不对? 先不管它,后面再看。
规定左右操作数:简化操作。
+,-的处理,左右操作数可以只支持数值型(可转为数字的值)。
&的处理,左右操作数只支持字符串。
所以,再看问题:
&与 +,-应该是不能并存的,所以,不用考虑上面的问题。如果并存,一定报错。
类似 = 2 + 3 & 4 先计算 2+3,然后计算 5 & 4,报错。所以,虽然同优先级,
也没啥错误。
嗯,对于我们能处理的公式,我们有了一些限定,也是简化处理,如果要进一步处理,可以据此深一层探索。
2:term 文法
term -> factor term'
term' -> mult_op factor term'
|divide_op factor term'
mult_op -> *
divide_op -> /
说明:
这种做法,也是常用算法书中一种技巧,将 优先级高于 +,-的* / 运算提取出来,放入term中,简化问题。
看看左右操作数,*,/ 只支持 可以只支持数值型
3:factor文法
factor -> [PLUS | MINUS] factor'
factor' -> NUM
|STRING
|FUNC LP args RP
|FUNC LP RP
|[Cell | Cell COLON Cell]
|LP expression RP
args -> expression
|expression COMMA args
COMMA -> ,
LP -> (
RP -> )
COLON -> :
好了,这是最关键的部分了。
3.1: [PLUS | MINUS]:表示 正,负号,对于负号,你应该进行处理。比如结果是数值,则取反值。
3.2: NUM:数值处理:
3.3: STRING: 字串处理。由配对双引号来识别。
3.4: FUNC LP args RP | FUNC LP RP:函数,带参数或不带参数。
此处,函数应该做判定,将已知函数转向相应的函数指针,如果是未知函数,则抛出语法错误。
注意:如果公式解析器处理底层,而做为上层应用的调用模块,那么,还可以将未知公式向上抛出,
将控制权暂交于上层,由上层计算结果后返回。
看看函数的详细处理:
解析参数(args):
多个参数用,隔开。
参数可能有两种,一是表达式方式,另一种是字串(其实,由双引号包含的也可以当表达式处理)。
字串可直接处理,表达式可递归调用expresion
参数压栈。以便后续的函数调用。
3.5: Cell[Range): 引用单元格(或者是范围),范围引的格式,如 A1:B2
3.6: LP Expresion RP:左右括号必须配对,中间递归表达式。
4:好了,上面已经把文法解释清楚了,可以用以下的公式来说明:
= SUM(A1,("abcd & "efgh"),(3+4*5)) + SUM_USER()
以上,也差不多就是本公式解析器的解析复杂度了。
看一下未处理的标记,如果需要,可以很方便的加进去。
%:应该定位于[PLUS | MINUS]同层。
!:如果做为非运算,可以定位于[PLUS | MINUS]同层。
$:看实际的含义而定。
@:看实际的含义而定。
#:这个比较特珠,看具体应用
|:如果是位运算的话,应该是与 * / 同层
/:如果是整除的话,可以与 * / 同层
= , < , >:这个是逻辑运算,这个暂时不讨论
[ , ] :看实际的含义而定。
`:视情况而定
^:如果是异或操作,可以与 * / 同层
;:视情况而定,
':单引号,视情况而定
?:视情况而定,一般会做为三目逻辑运算。
_:视情况而定
5:最后,不能漏了最关键的预测器程序(Advance程序)。
文法的解析,都是通过探测器来判定标识,并进行递推的。
一般会有以下几种处理;
5.1:返回本公式解析支持标识。正常情况。
5.2:返回本公式暂不支持的标识。一般会在文法解释时抛出语法无法解析的错误。
5.3:忽略的标识,比如 空格 /n /t ,跳动它,视其不存在。
6:其它:
上面的公式解析器缺少逻辑运算,其实呢,方法都是一样,只不过文法有些区别,并没有实际的复杂度。
以上差不多就是一个简单的公式解析器的处理方法。
一个简单的公式解析器相关推荐
- 自己动手实现一个简单的JSON解析器
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...
- json string 格式_自己动手实现一个简单的JSON解析器
作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...
- 一个简单的json解析器
实现一个简单地json解析器. 两部分组成,词法分析.语法分析 词法分析 package com.mahuan.json;import java.util.LinkedList; import jav ...
- 手写了一个简单的JSON解析器,网友直乎:牛!
作者 | 田小波 来源 | http://r3m2u.cn/4455O 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 X ...
- csv文件示例_自己动手? -一个简单的CSV解析器示例
csv文件示例 Download source code - 2.7 MB 下载源代码2.7 MB 目录 (Table of Contents) Introduction 介绍 The Dataset ...
- python 简历解析_pyresparser 一个简单的简历解析器,用于从简历中提取信息
pyresparser A simple resume parser used for extracting information from resumes Built with ❤︎ and ☕ ...
- 基于 Roslyn 实现一个简单的条件解析引擎
基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...
- FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- Ray Tracing in One Weekend从零实现一个简单的光线追踪渲染器
Ray Tracing in One Weekend学习笔记 1.Overview 从零开始实现一个简单的光线追踪渲染器,能够实现漫反射材质.金属材质.透明材质的渲染,此外还实现了摄像机的自由移动和焦 ...
最新文章
- Linux内核网络栈1.2.13-有关tcp/ip协议的基础入门
- 再议《反驳 吕震宇的“小议数据库主键选取策略(原创)” 》
- 英特尔推出模仿人脑运行方式、拥有800万组神经元的计算机系统
- hive安装测试及Hive 元数据的三种存储方式
- click vue 重复调用_VUE防止多次点击,重复请求
- mysql 上一篇_mysql取上一篇和下一篇的查询
- Java LinkedList对象的clone()方法和示例
- 硬核干货,老曹解密“语音交互”背后的黑科技!
- Spring Bean装配(上)
- MySQL复制原理与配置
- Max 缩放代码 获取2点直接的距离
- html 调用离线地图,百度地图API1.1制作的离线地图控件(html+webbroswer)
- UNIX网络编程的5种IO模型
- ubuntu安装WPS字体缺失的解决办法
- IEEE754 详点
- 判了!腾讯获赔 475 万!首例“微信自动抢红包”不正当竞争案宣判
- Windows Phone 7与Android和iPhone的比较
- 支票:现金支票转帐支票使用方法大全
- 基于springboot+layui快速开发框架源码
- 国密是什么意思?属于商密还是普密?
热门文章
- 微软为什么又牛起来了?
- 计算机科学与技术大学排名2019,2019计算机大学排行_计算机科学与技术专业大学排名-2018-2019计算机科学...
- BeeHive使用指南
- 【场景化解决方案】钉钉财务审批同步金蝶云星空
- 关于NOKIA E71 播放视频文件(mp4等)的问题
- Windows_XP DLL修改
- 商汤科技 java开发工程师 校招面经(已offer)
- LNMP和论坛的搭建
- name ‘train_test_split‘ is not defined解决方法
- 蓝牙SPP 基础知识