我见过两种在 Scala 中构建解析器的方法。
第一个是从 RegexParsers 扩展并定义您赢得的词汇模式。我看到的问题是我并不真正理解它如何处理关键字歧义。例如,如果我的关键字与 ident 匹配相同的模式,则它将关键字作为 ident 进行处理。
为了反驳这一点,我看过类似 this one 的帖子显示如何使用 StandardTokenParsers 来指定关键字。但是,我不明白如何指定正则表达式模式!是的,StandardTokenParsers 附带了“ident”,但它没有附带我需要的其他内容(复杂的 float 表示、特定的字符串文字模式和转义规则等)。
如何获得指定关键字的能力和使用正则表达式指定标记模式的能力?
最佳答案
我只编写了 RegexParsers
派生的解析器,但我所做的是这样的:
val name: Parser[String] = "[A-Z_a-z][A-Z_a-z0-9]*".r
val kwIf: Parser[String] = "if\\b".r
val kwFor: Parser[String] = "for\\b".r
val kwWhile: Parser[String] = "while\\b".r
val reserved: Parser[String] = ( kwIf | kwFor | kwWhile )
val identifier: Parser[String] = not(reserved) ~> name
关于parsing - 如何在 Scala 解析器组合器中组合正则表达式和关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3770569/