为了理解算法中的文法分析,用一个简单的公式解析器来说明。

公式计算是电子表格中的常用功能。主要是实现了些简单的公式计算:
   比如:=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:其它:
   上面的公式解析器缺少逻辑运算,其实呢,方法都是一样,只不过文法有些区别,并没有实际的复杂度。

以上差不多就是一个简单的公式解析器的处理方法。

一个简单的公式解析器相关推荐

  1. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  2. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  3. 一个简单的json解析器

    实现一个简单地json解析器. 两部分组成,词法分析.语法分析 词法分析 package com.mahuan.json;import java.util.LinkedList; import jav ...

  4. 手写了一个简单的JSON解析器,网友直乎:牛!

    作者 | 田小波 来源 | http://r3m2u.cn/4455O 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 X ...

  5. csv文件示例_自己动手? -一个简单的CSV解析器示例

    csv文件示例 Download source code - 2.7 MB 下载源代码2.7 MB 目录 (Table of Contents) Introduction 介绍 The Dataset ...

  6. python 简历解析_pyresparser 一个简单的简历解析器,用于从简历中提取信息

    pyresparser A simple resume parser used for extracting information from resumes Built with ❤︎ and ☕ ...

  7. 基于 Roslyn 实现一个简单的条件解析引擎

    基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...

  8. FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  9. Ray Tracing in One Weekend从零实现一个简单的光线追踪渲染器

    Ray Tracing in One Weekend学习笔记 1.Overview 从零开始实现一个简单的光线追踪渲染器,能够实现漫反射材质.金属材质.透明材质的渲染,此外还实现了摄像机的自由移动和焦 ...

最新文章

  1. Linux内核网络栈1.2.13-有关tcp/ip协议的基础入门
  2. 再议《反驳 吕震宇的“小议数据库主键选取策略(原创)” 》
  3. 英特尔推出模仿人脑运行方式、拥有800万组神经元的计算机系统
  4. hive安装测试及Hive 元数据的三种存储方式
  5. click vue 重复调用_VUE防止多次点击,重复请求
  6. mysql 上一篇_mysql取上一篇和下一篇的查询
  7. Java LinkedList对象的clone()方法和示例
  8. 硬核干货,老曹解密“语音交互”背后的黑科技!
  9. Spring Bean装配(上)
  10. MySQL复制原理与配置
  11. Max 缩放代码 获取2点直接的距离
  12. html 调用离线地图,百度地图API1.1制作的离线地图控件(html+webbroswer)
  13. UNIX网络编程的5种IO模型
  14. ubuntu安装WPS字体缺失的解决办法
  15. IEEE754 详点
  16. 判了!腾讯获赔 475 万!首例“微信自动抢红包”不正当竞争案宣判
  17. Windows Phone 7与Android和iPhone的比较
  18. 支票:现金支票转帐支票使用方法大全
  19. 基于springboot+layui快速开发框架源码
  20. 国密是什么意思?属于商密还是普密?

热门文章

  1. 微软为什么又牛起来了?
  2. 计算机科学与技术大学排名2019,2019计算机大学排行_计算机科学与技术专业大学排名-2018-2019计算机科学...
  3. BeeHive使用指南
  4. 【场景化解决方案】钉钉财务审批同步金蝶云星空
  5. 关于NOKIA E71 播放视频文件(mp4等)的问题
  6. Windows_XP DLL修改
  7. 商汤科技 java开发工程师 校招面经(已offer)
  8. LNMP和论坛的搭建
  9. name ‘train_test_split‘ is not defined解决方法
  10. 蓝牙SPP 基础知识