学习如何使用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)
}
}
答案 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
“规则”“消耗”。