2010-11-25 6 views
2

スカラーDSLの使い方を学んでください。 しかし、私は非常に単純なことに固執する: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

ていない正規表現--.*$マッチ、Scalaの精通が、Javaで:

  • --   2ハイフン。
  • .*  その後に改行以外の文字が0個以上続きます。
  • $    入力の最後に(必ずしも行の終わりではない)!

だからあなたが試みることができる:

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

かさえ:

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

注意」の両方のケースでは、改行が所定の位置に残っているし、あなたのcommentによって "消費" ではないことルール"。

+0

完璧、ありがとう!愚かな私はこれがscalaの一致の問題、 正規表現の問題ではないと思った。 –

+0

@Bjorn、:)、大歓迎です! –

関連する問題