我已经看到了两种在Scala中构建解析器的方法。
第一个是从RegexParsers扩展并定义你赢得的词汇模式。我看到的问题是,我真的不明白它是如何处理关键词含糊不清的。例如,如果我的关键字与idents匹配相同的模式,那么它会将关键字处理为idents。
为了解决这个问题,我看过像this one这样的帖子,它们展示了如何使用StandardTokenParsers来指定关键字。但是,我不明白如何指定正则表达式模式!是的,StandardTokenParsers带有“ident”但它没有我需要的其他(复杂的浮点数表示,特定的字符串文字模式和转义规则等)。
如何同时获得指定关键字的能力以及使用正则表达式指定令牌模式的能力?
答案 0 :(得分: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