2010-09-22 63 views
3

我见过两种在Scala中构建分析器的方法。如何在Scala分析器组合器中结合Regexp和关键字

第一个是从RegexParsers扩展并定义你赢得的词汇模式。我看到的问题是,我不太了解它如何处理关键字歧义。例如,如果我的关键字与ident匹配相同的模式,那么它会将关键字处理为idents。

为了解决这个问题,我看到类似this one这样的帖子展示了如何使用StandardTokenParsers指定关键字。但是,我不明白如何指定正则表达式模式!是的,StandardTokenParsers带有“ident”,但它并不包含我需要的其他字符(复杂的浮点数字表示,特定的字符串字面模式和转义规则等)。

如何获得指定关键字的能力以及使用正则表达式指定标记模式的能力?

回答

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 
+0

我以前见过的这项建议,并尝试过,但有问题的地方似乎消耗令牌合格与不(...)。但是,我只是试了一遍,它确实有效。谢谢! – 2010-09-22 16:04:23

+0

正则表达式中“\ b”的含义是什么?当然,你不用输入语言编码退格?!? – 2010-09-22 16:05:25

+0

更正。我的意思是指定一个字边界。否则,您会匹配显示为合法标识符前缀的(伪)关键字。 – 2010-09-22 16:09:25