2010-09-27 71 views
3

我正在學習編寫一個簡單的解析器 - 組合器。我從下到上編寫規則並編寫單元測試,以便隨時進行驗證。但是,我在使用repsep()和空格作爲分隔符時被阻止。scala:解析器幫助

object MyParser extends RegexParsers { 
    lazy val listVal:Parser[List[String]]=elem('{')<~repsep("""\d+""".r,"""\s+""".r)~>elem('}') 
} 

該規則被簡化以說明問題。當我喂與分析器 「{1 2 3}」 時,它總是抱怨說,它不匹配:

[1.4]失敗:`} '預期,但2發現

I'我想知道按照我所描述的方式編寫規則的正確方法是什麼?

感謝

回答

6

默認情況下,RegexParsers衍生解析器試圖匹配任何終端符號之前跳過空白。除非你的空白解釋是不尋常的,你可以用它來處理。如果您希望忽略空白的特定字符(序列)不是默認值(\s+),則可以覆蓋RegexParsers解析器中預計的val whiteSpace: Regex = ...值。如果你沒有任何這樣的空白跳過發生,override def skipWhitespace = false

編輯:所以,是的,改變這種:

repsep("""\d+""".r,"""\s+""".r) 

這樣:

rep("""\d+""".r) 

,離開一切RegexParsers不變別的定義應該做你想要什麼。

順便說一句,repsep的常見用途是用逗號分隔的列表,您需要確保逗號在那裏,但不需要將它們保留在生成的分析樹(或AST)中。

+0

aka將'repsep(「」「\ d +」「」。r ...)'改爲'rep(「」「\ d +」「」r)'? – svrist 2010-09-27 13:05:01