加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

了解Scala解析器组合器中的波浪号

发布时间:2020-12-16 09:43:21 所属栏目:安全 来源:网络整理
导读:我相当新的Scala和阅读关于解析器组合器( The Magic Behind Parser Combinators, Domain-Specific Languages in Scala)我遇到了这样的方法定义: def classPrefix = "class" ~ ID ~ "(" ~ formals ~ ")" 我一直在阅读scala.util.parsing.Parsers的API文档,
我相当新的Scala和阅读关于解析器组合器( The Magic Behind Parser Combinators, Domain-Specific Languages in Scala)我遇到了这样的方法定义:

def classPrefix = "class" ~ ID ~ "(" ~ formals ~ ")"

我一直在阅读scala.util.parsing.Parsers的API文档,它定义了一个名为(tilde)的方法,但是我仍然不明白其在上面的例子中的用法。
在这个例子中(tilde)是一个在java.lang.String上调用的方法,它不具有该方法并导致编译器失败。
我知道(波浪号)被定义为

case class ~ [+a,+b] (_1: a,_2: b)

但是在上面的例子中这有助于帮助吗?

如果有人能给我一个提示来了解这里发生了什么,我会很高兴。
非常感谢你提前!

一月

解决方法

这里的结构有点棘手。首先,请注意,您始终将这些内容定义在某个解析器的子类中,例如MyParser类扩展了RegexParsers。现在,您可能会注意到RegexParsers中的两个隐式定义:

implicit def literal (s: String): Parser[String]
implicit def regex (r: Regex): Parser[String]

这些将做什么是采取任何字符串或正则表达式,并将它们转换为与该字符串或该正则表达式匹配的解析器作为令牌。它们是隐式的,因此它们将在需要的时候被应用(例如,如果您调用了一个String(或Regex)没有的Parser [String]方法)。

但是这个解析器是什么东西?这是一个内部类,在Pararsers中定义,RegexParser的supertrait:

class Parser [+T] extends (Input) ? ParseResult[T]

看起来它是一个功能,需要输入并将其映射到结果。那么有道理!您可以看到它的文档here。

现在我们可以直接查看?方法:

def ~ [U] (q: ? Parser[U]): Parser[~[T,U]]
  A parser combinator for sequential composition
  p ~ q' succeeds if p' succeeds and q' succeeds on the input left over by p'.

所以,如果我们看到类似的东西

def seaFacts = "fish" ~ "swim"

会发生什么,首先,“鱼”没有?方法,所以它隐式转换为Parser [String]。那么?方法然后需要一个Parser [U]类型的参数,所以我们将“swim”隐式转换成Parser [String](即U == String)。现在我们有一些匹配输入“鱼”的东西,输入中留下的任何东西都应该匹配“游泳”,如果两者都匹配,那么seaFacts将在匹配中成功。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读