一.本章要点

  • 文法定义中的二选一、拼接、选项和重复在Scala组合子解析器中对应|、~、opt和rep
  • 对于RegexParsers而言,字符串字面量和正则表达式匹配的是词法单元
  • 用^^来处理解析结果
  • 在提供给^^的函数中使用模式匹配来将~结果拆开
  • 用~>或<~来丢弃那些在匹配后不再需要的词法单元
  • repsep组合子处理那些常见的用分割符分割开的条目
  • 基于词法单元的解析器对于解析器那种带有保留字和操作符的语言很有用。准备好定义你自己的词法分析器
  • 解析器是消费读取器并产出解析结果:成功、失败或错误的函数
  • Failure结果提供了用于错误报告的明细信息
  • 可能想要添加failure语句到文法当中来改进错误提示的质量
  • 凭借操作符号、隐式转换和模式匹配,解析器组合子类库让任何能理解无上下文文法的人都可以很容易地编写解析器

二.文法

  一组用于产出所有遵循某个特定结构的字符串的规则。

  更高效的方法:在解析开始前收集好数字(词法分析),词法分析器会丢弃掉空白和注释并形成词法单元——标识符、数字和符号。

  注:op和expr不是词法单元,它们是结构化的元素,是文法的作者创造出来的,目地是产出正确的词法单元序列(非终结符号)。。。

三.组合解析器操作

  为了使用Scala解析库,需要提供一个扩展自Parsers特质的类定义那些有基本操作组合起来的解析操作。。。

四.解析结果变换

  将中间输出变换成有用的形式。。。  

五.丢弃词法单元

  对于解析来说。词法单元是必需的,但在匹配之后可以被丢弃掉。(使用~>和<~匹配丢弃)。。。  

六.生成解析树

  在构建解释器或者编译器时,会想要构建一棵解析树(通常用样例类来实现)。

七.避免左递归

  如果解析器在解析输入之前就调用自己的话,就会一直递归下去。。。

八.更多的组合子

  rep方法匹配零个或多个重复项。。。

  

九.避免回溯

  p|q被解析而p失败时,解析器会用同样的输入尝试q,这样的回溯效果很低效,使用~!表示不需要回溯(p~!q)

十.记忆式解析器

  使用一个高效的解析算法,该算法会捕获到之前的结果,好处:解析时间可以确保与输入长度成比例的关系解析器可以接受左递归语法。。。

  使用解析器:

  

十一.解析器到底是什么

  Parser[T]是一个带有单个参数的函数,参数类型为Reader[Elem],而返回值的类型为ParseResult[T]。解析器都扩展自RegexParsers,该特质有一个从Regex到Parser[String]的隐式转换。。。  

十二.正则解析器

  RegexParsers特质在我们到目前为止的所有解析器示例中都用到了,提供了两个用于定义解析器的隐式转换:

    Literal从一个字符串字面量(比如”+“)做出一个Parser[String];

    regex从一个正则表达式(比如”[0-9]“.r)做出一个Parser

十三.基于词法单元的解析器

  基于词法单元的解析器使用Reader[Token]而不是Reader[Char]。Token类型定义在特质scala.util.parsing.token.Token特质中。StdToken子特质中定义了四种解析编程语言时遇到的词法单元:Identifier(标识符),Keyword(关键字),NumbericLit(数值字面量),StringLit(字符串字面量)。。。    

十四.错误处理

  当解析器不能呢个接受某个输入时,解析器会生成一个错误的提示,描述解析器在某个位置无法继续了。。。

十五.练习

Scala学习十九——解析的更多相关文章

  1. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  2. 强化学习(十九) AlphaGo Zero强化学习原理

    在强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)中,我们讨论了MCTS的原理和在棋类中的基本应用.这里我们在前一节MCTS的基础上,讨论下DeepMind的AlphaGo Zero强化学 ...

  3. Scala学习十六——XML处理

    一.本章要点 XML字面量<like>this</like>的类型为NodeSeq 可以在XML字面量中内嵌Scala代码 Node的child属性产出后代节点 Node的at ...

  4. Scala学习十八——高级类型

    一.本章要点 单例类型可用于方法串接和带对象参数的方法 类型投影对所有外部类的对象都包含了其他内部类的实例 类型别名给类型指定一个短小的名称 结构类型等效于”鸭子类型“ 存在类型为泛型的通配参数提供了 ...

  5. Scala学习十二——高阶函数

    一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...

  6. Scala学习十——特质

    一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...

  7. Scala学习十五——注解

    一.本章要点 可以为类.方法.字段.局部变量.参数.表达式.类型参数以及各种类型定义添加注解 对于表达式和类型,注解跟在被注解的条目之后 注解的形式有@Annotation.@Annotation(v ...

  8. Spring学习(十九)----- Spring与WEB容器整合

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

  9. Spring学习(十九)----- Spring的五种事务配置详解

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

随机推荐

  1. MySQL:数据库名或者数据表名包含-

    [参考文章]:mysql数据库名称中包含短横线的对应方式 1. 现象 命令行下操作 名称包含 " - " 数据库或者数据表时,语句执行报错: 2. 解决方案: 使用 `` 字符(E ...

  2. hystrix(一) 简单使用, 以及动态配置更新

    本文转载自https://my.oschina.net/u/1169457/blog/1787414 hystrix 简单使用, 以及动态配置更新 概述 只介绍同步模式下简单的使用, 有助于快速接入, ...

  3. Vue生命周期钩子函数加载顺序的理解

    Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁的过程,就是生命周期 ...

  4. <JavaScript> 关于闭包和this对象

    1.this指向windows是如何得出的 var name = "The Window"; var object = { name : "My Object" ...

  5. 微信自定义分享 IOS端分享失败

    1.在IOS微信浏览器中自定义分享link 链接中的中文需要encodeURIComponent() 编码(安卓会自动编码) 2.另外在IOS微信浏览器中自定义分享 imgUrl  不能大于34KB ...

  6. java使用jconsole查看java程序运行(jmx原理)

    在JVM启动参数上加上     java -Dcom.sun.management.jmxremote.port=8999     -Dcom.sun.management.jmxremote.aut ...

  7. Spring事务管理3----声明式事务管理(1)

     声明式事务管理(1)基于    基于 tx/aop  这种事务管理相比编程式事务管理来说对业务层基本没有改动,通过  TransactionProxyFactoryBean 创建业务层的代理,通过A ...

  8. 生产订单BADI实例

    转自:https://blog.csdn.net/wbin9752/article/details/7951390 以生产订单收货为例: 1.BADI的查找方法: SE38在程序中搜索关键字CL_EX ...

  9. layer弹框层学习笔记

    这里对layer的笔记只是大概记录一下其使用过程,以便后续使用时快速回顾,更详细使用及介绍参考官网实例.链接在本文末 一 .初步了解layer-弹层之美 layer是一款近年来备受青睐的web弹层组件 ...

  10. IndemindSDK数据采集程序

    目录 Indemind相机数据采集 Indemind相机数据采集 最近做一些实验需要自己采集一些数据玩玩,打算用之前买的indemind双目模组,实际用的时候感觉官方提供的采集程序不太好用,于是打算自 ...