3

我正在使用 Scala 中的本机解析器组合器库,我想解析输入的某些部分,而不是其他部分。具体来说,我想丢弃我关心的输入之间的所有任意文本。例如,使用此输入:

begin

Text I care about
Text I care about

DONT CARE

Text I don't care about

begin

More text I care about
...

现在我有:

object MyParser extends RegexParsers {
    val beginToken: Parser[String] = "begin"
    val dontCareToken: Parser[String] = "DONT CARE"
    val text: Parser[String] = not(dontCareToken) ~> """([^\n]+)""".r

    val document: Parser[String] = begin ~> text.+ <~ dontCareToken ^^ { _.mkString("\n") }
    val documents: Parser[Iterable[String]] = document.+

但我不知道如何忽略后面DONT CARE和直到下一个的文本begin。具体来说,我不想对该文本的形式做出任何假设,我只想在下begin一条语句处重新开始解析。

4

1 回答 1

6

你几乎拥有它。解析你不关心的东西,然后什么也不做。

我添加了dontCareTextskipDontCare,然后在您的文档解析器中指出skipDontCare是可选的。

import scala.util.parsing.combinator.RegexParsers   

object MyParser extends RegexParsers {
    val beginToken: Parser[String] = "begin"
    val dontCareToken: Parser[String] = "DONT CARE"
    val text: Parser[String] = not(dontCareToken) ~> """([^\n]+)""".r
    val dontCareText: Parser[String] = not(beginToken) ~> """([^\n]+)""".r
    val skipDontCare = dontCareToken ~ dontCareText ^^ { case c => "" }

    val document: Parser[String] = 
      beginToken ~> text.+ <~ opt(skipDontCare) ^^ { 
        _.mkString("\n") 
      }
    val documents: Parser[Iterable[String]] = document.+
}


val s = """begin

Text I care about
Text I care about

DONT CARE

Text I don't care about

begin

More text I care about
"""

MyParser.parseAll(MyParser.documents,s)
于 2013-09-25T17:20:11.857 回答