2010-09-22 48 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

相關問題