Skip to content

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

License

Notifications You must be signed in to change notification settings

scala/scala-parser-combinators

Folders and files

NameName
Last commit message
Last commit date
Feb 27, 2025
Sep 28, 2021
Dec 22, 2024
Dec 22, 2024
Dec 22, 2024
Apr 22, 2025
Dec 22, 2024
Jun 17, 2021
Dec 20, 2020
Apr 23, 2019
Mar 29, 2019
Jan 7, 2025
Dec 16, 2024
Feb 27, 2025

Repository files navigation

scala-parser-combinators

build

This was originally part of the Scala standard library, but is now community-maintained, under the guidance of the Scala team at Akka (formerly Lightbend). If you are interested in joining the maintainers team, please contact @Philippus or @SethTisue.

Choosing a parsing library

This library's main strengths are:

  • Stability. It's been around and in wide use for more than a decade.
  • The codebase is modest in size and its internals are fairly simple.
  • It's plain vanilla Scala. No macros, code generation, or other magic is involved.
  • Multiple versions of Scala (2.12, 2.13, 3) are supported on all back ends (JVM, JS, Native).

Its main weaknesses are:

  • Performance. If you are ingesting large amounts of data, you may want something faster.
  • Minimal feature set.
  • Inflexible, unstructured error reporting.

A number of other parsing libraries for Scala are available -- see list on Scaladex.

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" % <version>

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

Scala.js and Scala Native

Scala-parser-combinators is also available for Scala.js and Scala Native:

libraryDependencies += "org.scala-lang.modules" %%% "scala-parser-combinators" % <version>

Example

import scala.util.parsing.combinator._

case class WordFreq(word: String, count: Int) {
  override def toString = s"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(s"FAILURE: $msg")
      case Error(msg,_) => println(s"ERROR: $msg")
    }
  }
}

For a detailed unpacking of this example see Getting Started.

Contributing

About

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

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages