2010-11-25 59 views
2

學習如何使用scala DSL:s和很多例子都很好用。 但是我陷在了一個非常簡單的事情:scala dsl解析器:rep,opt和regexps

我解析語言,其中有' - '作爲評論,直到行結束。

單行工作正常使用:

def comment: Parser[Comment] = """--.*$""".r ^^ { case c => Comment(c) } 

但是連接多條線路時,我得到一個錯誤。

我試過幾個varaints,但下面簡單的感覺:

def commentblock: Parser[List[Comment]] = opt(rep(comment)) ^^ { 
    case Some(x) => { x } 
    case None => { List() } 
} 

運行測試時兩個連續commentlines我得到一個錯誤。

測試用例:

--Test Comment 
--Test Line 2 

錯誤:

java.lang.AssertionError: Parse error: [1.1] failure: string matching regex `--.*$' expected but `-' found 

,我應該如何解決這個問題的任何想法?

下面

完整代碼:

import scala.util.parsing.combinator._ 

abstract class A 
case class Comment(comment:String) extends A 

object TstParser extends JavaTokenParsers { 
    override def skipWhitespace = true; 

    def comment: Parser[Comment] = """--.*$""".r ^^ { case c => Comment(c) } 

    def commentblock: Parser[List[Comment]] = opt(rep(comment)) ^^ { 
     case Some(x) => { x } 
     case None => { List() } 
    } 

    def parse(text : String) = { 
     parseAll(commentblock, text) 
    } 
} 

class TestParser { 
    import org.junit._, Assert._ 

    @Test def testComment() = { 
     val y = Asn1Parser.parseAll(Asn1Parser.comment, "--Test Comment") 
     assertTrue("Parse error: " + y, y.successful) 
     val y2 = Asn1Parser.parseAll(Asn1Parser.commentblock, 
"""--Test Comment 
--Test Line 2 
""") 
     assertTrue("Parse error: " + y2, y2.successful) 
    } 

}

回答

2

不熟悉斯卡拉,但在Java中,正則表達式匹配--.*$

  • --  兩個連字符;
  • .*  後面跟零或多個字符而不是換行符;
  • $    後面跟着輸入的結尾(不一定是行尾!)。

所以,你可以嘗試:

def comment: Parser[Comment] = """--.*""".r ^^ { case c => Comment(c) } 

甚至:

def comment: Parser[Comment] = """--[^\r\n]*""".r ^^ { case c => Comment(c) } 

注意,在這兩種情況下,換行符留在原地,而不是 「消耗」 你comment「規則」。

+0

完美的作品,謝謝!傻我認爲這是一個斯卡拉匹配問題, 不是一個正則表達式問題。 – 2010-11-29 20:42:35