scala / scala-parser-combinators

simple combinator-based parsing for Scala. formerly part of the Scala standard library, now a separate community-maintained module

Github

scala-parser-combinators Gitter

Scala Standard Parser Combinator Library

This library is now community-maintained. If you are interested in helping please contact @gourlaysama or mention it on Gitter.

As of Scala 2.11, this library is a separate jar that can be omitted from Scala projects that do not use Parser Combinators.

Documentation

Adding an SBT dependency

To depend on scala-parser-combinators in SBT, add something like this to your build.sbt:

libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.6"

(Assuming you're using a scalaVersion for which a scala-parser-combinators is published. The first 2.11 milestone for which this is true is 2.11.0-M4.)

To support multiple Scala versions, see the example in https://github.com/scala/scala-module-dependency-sample.

Example

import scala.util.parsing.combinator._

case class WordFreq(word: String, count: Int) {
    override def toString = "Word <" + word + "> " +
                            "occurs with frequency " + count
}

class SimpleParser extends RegexParsers {
    def word: Parser[String]   = """[a-z]+""".r       ^^ { _.toString }
    def number: Parser[Int]    = """(0|[1-9]\d*)""".r ^^ { _.toInt }
    def freq: Parser[WordFreq] = word ~ number        ^^ { case wd ~ fr => WordFreq(wd,fr) }
}

object TestSimpleParser extends SimpleParser {
    def main(args: Array[String]) = {
        parse(freq, "johnny 121") match {
            case Success(matched,_) => println(matched)
            case Failure(msg,_) => println("FAILURE: " + msg)
            case Error(msg,_) => println("ERROR: " + msg)
        }
    }
}

For a detailed unpacking of this example see Getting Started.

ScalaJS support

Scala-parser-combinators directly supports scala-js 0.6+, starting with v1.0.5:

libraryDependencies += "org.scala-lang.modules" %%% "scala-parser-combinators" % "1.0.6"

Contributing