词法分析器教程

A tutorial on Lexical parser

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

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

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

rep1 inside a RegexParsers 将调用 skipWhitespace 在它解析的东西之间 - 这意味着你得到一个 Seq 和两个 as在里面。如 RegexParsers.

中所述

如果您想获取 line:col 数据,请将您的解析结果类型扩展为 Position, and wrap the parser in a call to positioned:

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