【问题标题】:Scala Parser Combinators - consume until matchScala Parser Combinators - 消费直到匹配
【发布时间】:2013-09-25 15:38:29
【问题描述】:

我正在使用 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 语句处重新开始解析。

【问题讨论】:

    标签: scala parser-combinators


    【解决方案1】:

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

    我添加了 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多