一.本章要点

  • 文法定义中的二选一、拼接、选项和重复在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. eclipse java

    1Java:Java是由Sun Microsystems公司推出的Java面向对象程序设计语言和Java平台的总称. 2.Eclipse:Eclipse 是一个开放源代码的.基于Java的可扩展开发平 ...

  2. 美国药品销售额top200

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  3. kotlin泛型中星号投射

    如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现 ...

  4. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_24-页面预览-页面预览测试

    通过nginx转发到预览的地址 重启nginx 添加页面预览按钮 调整下列表的列的宽度

  5. springboot动态定时任务

    SpringBoot设置动态定时任务 一.说明 1.在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置. 2.定时任务执行时间可根据数据库中某个设置字段动 ...

  6. app怎么获取package与active name

    1.aapt dump badging apk名称 2.adb logcat | grep START 或者 adb shell "logcat | grep START" 然后在 ...

  7. 删除badi及badi interface

    转自:https://blog.csdn.net/zeewjj/article/details/7963147 Use Function Module OO_INTERFACE_DELETE and ...

  8. 使用super函数----增量重写普通方法和构造方法

    使用super函数----增量重写普通方法和构造方法 在子类中如果重写了超类的方法,通常需要在子类方法中调用超类的同名方法,也就是说,重写超类的方法,实际上应该是一种增量的重写方式,子类方法会在超类的 ...

  9. xampp 启动mysql 显示busy

    1.端口被占用问题:2.默认3306端口并没有被占用:3.删除xampp\mysql\data\下的ibdata1再重启:4.没装其他mysql.

  10. postman+jmeter接口实例

    接口基础 一.为什么要单独测试接口? 1. 程序是分开开发的,前端还没有开发,后端已经开发完了,可以提前进入测试2. 接口直接返回的数据------越底层发现bug,修复成本是越低的3. 接口测试能模 ...