如何在Scala解析器组合器中组合Regexp和关键字

Mic*_*ler 3 parsing scala keyword lexical-analysis lexical

我已经看到了两种在Scala中构建解析器的方法.

第一个是从RegexParsers扩展并定义您赢得的词汇模式.我看到的问题是,我真的不明白它是如何处理关键词含糊不清的.例如,如果我的关键字与idents匹配相同的模式,那么它会将关键字作为标识进行处理.

为了应对这一点,我已经看到了类似的帖子这样一个说明如何使用StandardTokenParsers指定关键字.但是,我不明白如何指定正则表达式模式!是的,StandardTokenParsers带有"ident"但它没有我需要的其他(复杂的浮点数表示,特定的字符串文字模式和转义规则等).

如何同时获得指定关键字的能力以及使用正则表达式指定令牌模式的能力?

Ran*_*ulz 8

我只编写了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
Run Code Online (Sandbox Code Playgroud)