了解Scala解析器组合器中的波浪号
我相当新的Scala和阅读关于解析器组合器(
The Magic Behind Parser Combinators,
Domain-Specific Languages in Scala)我遇到了这样的方法定义:
def classPrefix = "class" ~ ID ~ "(" ~ formals ~ ")" 我一直在阅读scala.util.parsing.Parsers的API文档,它定义了一个名为(tilde)的方法,但是我仍然不明白其在上面的例子中的用法。 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将在匹配中成功。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |