Комбинаторы синтаксического анализатора Scala - потребляйте до совпадения

Я работаю с собственной библиотекой комбинатора синтаксического анализатора в 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.


person John Sullivan    schedule 25.09.2013    source источник


Ответы (1)


Вы почти получили это. Анализируйте то, что вам все равно, и ничего не делайте с этим.

Я добавил dontCareText и skipDontCare, а затем в анализаторе вашего документа указал, что 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)
person Keith Pinson    schedule 25.09.2013