Skip to content

Latest commit

 

History

History
86 lines (61 loc) · 4.41 KB

README.md

File metadata and controls

86 lines (61 loc) · 4.41 KB

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

importscala.util.parsing.combinator._caseclassWordFreq(word: String, count: Int) { overridedeftoString=s"Word <$word> occurs with frequency $count" } classSimpleParserextendsRegexParsers { defword:Parser[String] ="""[a-z]+""".r ^^ { _.toString } defnumber:Parser[Int] ="""(0|[1-9]\d*)""".r ^^ { _.toInt } deffreq:Parser[WordFreq] = word ~ number ^^ { case wd ~ fr =>WordFreq(wd,fr) } } objectTestSimpleParserextendsSimpleParser { defmain(args: Array[String]) = { parse(freq, "johnny 121") match { caseSuccess(matched,_) => println(matched) caseFailure(msg,_) => println(s"FAILURE: $msg") caseError(msg,_) => println(s"ERROR: $msg") } } }

For a detailed unpacking of this example see Getting Started.

Contributing

close