关于词法分析器的教程

时间:2016-01-03 21:21:48

标签: scala scanning parser-combinators combinators

我对空格上的解析器组合器有点困惑。即使关键字是“keywordandtherestofthestream”中的前缀,它们也会使用关键字。此外,identifier = rep1("a")使用a a中的两个字母作为单aa。这些信息表明我需要做一些lexing,并且可以将解析器组合器堆叠在词法分析器的顶部。

我看到有一个特殊的Lexical解析器来实现此目的。但为什么实际上这个解析器用于标记化?有什么意义?为什么它更有利?它的EOLwhitespace方法有什么意义?它是否与我在skipWhitespace中看到的RegexParsers无关?此外,我找不到任何将解析器堆叠在词法分析器上的示例。在我看来,更高级别的RegexParsers使用Input,这是一个字符流。它怎么可能是一个令牌流?

顺便说一下,是否可以在其中建立位置跟踪(line:col)?

1 个答案:

答案 0 :(得分:1)

rep1内的RegexParsers会在其解析的内容之间调用skipWhitespace - 意味着您获得Seq两个a s在里面。这与RegexParsers中记录的一样。

如果您想获取line:col数据,请将解析的结果类型扩展为Position,并将解析器包装到positioned的调用中:

object Parser extends RegexParsers {
  case class MyType(value: String) extends Positional
  val myType: Parser[MyType] = positioned { "typey" ^^ { MyType.apply } }
}