我使用解析器组合器将准结构化日志文件数据转换为JSON。我希望随着位置信息丰富结果,以便输出中的数据元素可以位于原始输入文件中。当我在source code和API 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 post和its 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
所需的最小脚手架是什么?
答案 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
。