我对空格上的解析器组合器有点困惑。即使关键字是“keywordandtherestofthestream”中的前缀,它们也会使用关键字。此外,identifier = rep1("a")
使用a a
中的两个字母作为单aa
。这些信息表明我需要做一些lexing,并且可以将解析器组合器堆叠在词法分析器的顶部。
我看到有一个特殊的Lexical解析器来实现此目的。但为什么实际上这个解析器用于标记化?有什么意义?为什么它更有利?它的EOL
和whitespace
方法有什么意义?它是否与我在skipWhitespace
中看到的RegexParsers
无关?此外,我找不到任何将解析器堆叠在词法分析器上的示例。在我看来,更高级别的RegexParsers使用Input
,这是一个字符流。它怎么可能是一个令牌流?
顺便说一下,是否可以在其中建立位置跟踪(line:col
)?
答案 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 } }
}