词法分析器教程
A tutorial on Lexical parser
我对空格上的解析器组合器有点困惑。即使关键字是 "keywordandtherestofthestream" 中的前缀,它们也会使用关键字。此外,identifier = rep1("a")
将 a a
中的两个字母作为单个 aa
使用。这些信息表明我需要做一些词法分析,并且可以将解析器组合器堆叠在词法分析器之上。
我看到有一个特殊的 Lexical 解析器可以满足此目的。但为什么实际上这个解析器用于标记化?重点是什么?为什么更有优势?它的 EOL
和 whitespace
方法有什么意义?它与我在 RegexParsers
中看到的 skipWhitespace
有任何关系吗?此外,我找不到任何将解析器堆叠在词法分析器之上的示例。在我看来,更高级别的 RegexParsers 使用 Input
,这是一个字符流。怎么可能是令牌流呢?
顺便说一句,是否可以在其中构建位置跟踪 (line:col
)?
rep1
inside a RegexParsers
将调用 skipWhitespace
在它解析的东西之间 - 这意味着你得到一个 Seq
和两个 a
s在里面。如 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 } }
}
我对空格上的解析器组合器有点困惑。即使关键字是 "keywordandtherestofthestream" 中的前缀,它们也会使用关键字。此外,identifier = rep1("a")
将 a a
中的两个字母作为单个 aa
使用。这些信息表明我需要做一些词法分析,并且可以将解析器组合器堆叠在词法分析器之上。
我看到有一个特殊的 Lexical 解析器可以满足此目的。但为什么实际上这个解析器用于标记化?重点是什么?为什么更有优势?它的 EOL
和 whitespace
方法有什么意义?它与我在 RegexParsers
中看到的 skipWhitespace
有任何关系吗?此外,我找不到任何将解析器堆叠在词法分析器之上的示例。在我看来,更高级别的 RegexParsers 使用 Input
,这是一个字符流。怎么可能是令牌流呢?
顺便说一句,是否可以在其中构建位置跟踪 (line:col
)?
rep1
inside a RegexParsers
将调用 skipWhitespace
在它解析的东西之间 - 这意味着你得到一个 Seq
和两个 a
s在里面。如 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 } }
}