定位运算符可以与RegexParsers一起使用吗?

时间:2017-01-25 23:14:03

标签: scala

我使用解析器组合器将准结构化日志文件数据转换为JSON。我希望随着位置信息丰富结果,以便输出中的数据元素可以位于原始输入文件中。当我在source codeAPI docs中看到positioned方法的描述时,我认为解决方案就在我面前,但我却反对这样的异常:

Error:(133, 24) inferred type arguments [String] 
do not conform to method positioned's type 
parameter bounds [T <: scala.util.parsing.input.Positional]

tutorial blog post on parser combinators提升,我希望能够说出这样的话:

object ReallySimpleParser2 extends RegexParsers {
  def sentence = positioned { hello ~ world }
  def hello = "hello"
  def world = "world"
}

这个猜想的灵感来自this blog postits accompanying source code,这是我能找到的第一个使用positioned修饰符的完整例子,尽管是在一个完整的解析器/词法练习中。他们能够说出这样的话:

def identifier: Parser[IDENTIFIER] = positioned {
  "[a-zA-Z_][a-zA-Z0-9_]*".r ^^ { str => IDENTIFIER(str) }
}

大概归功于定义IDENTIFIER类型所涉及的魔力。

所以问题是可以positioned开箱即用RegexParser吗?如果是,如何,如果不是,positioned使用RegexParser所需的最小脚手架是什么?

1 个答案:

答案 0 :(得分:0)

positioned只能包装一个生成Positional子类的解析器。这是一个例子:

import scala.util.parsing.combinator.RegexParsers
import scala.util.parsing.input.Positional

case class Content(value: String) extends Positional

object ReallySimpleParser2 extends RegexParsers {
  def sentence = positioned { hello ~ world ^^ { case a ~ b => Content(s"$a $b") } }
  def hello = "hello"
  def world = "world"
}

因此,在第二个示例中,IDENTIFIER必须扩展Positional