scala dsl解析器:rep,opt和regexps

时间:2010-11-25 15:31:21

标签: regex parsing scala dsl

学习如何使用scala DSL:s和相当多的例子很好用。 但是我被困在一个非常简单的事情上:

我正在解析一种语言,其中“ - ”作为注释直到行尾。

单行可以正常使用:

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

但是当连接多行时,我收到错误。

我尝试了几种变量,但以下情况很简单:

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

当运行带有两个连续评论行的测试时,我收到错误。

测试用例:

--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)
    }

}

1 个答案:

答案 0 :(得分:2)

不熟悉Scala,但在Java中,正则表达式--.*$匹配:

  • --两个连字符;
  • .*后跟除换行符之外的零个或多个字符;
  • $后跟输入结束(不一定是行尾!)。

所以你可以试试:

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

甚至:

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

请注意,在这两种情况下,换行符都会保留,而不会被comment“规则”“消耗”。