scala / scala-parser-combinators

simple combinator-based parsing for Scala. formerly part of the Scala standard library, now a separate community-maintained module
Apache License 2.0
656 stars 131 forks source link

Add ability to defined new parser combinators #323

Open scabug opened 15 years ago

scabug commented 15 years ago

The current parser combinators library is flexible but lacks the ability to easily define new combinators. For example, in a grammar that supports JavaTokensParser.wholeNumber and JavaTokensParser.floatingPointNumber literals and an e .. e expression, 1..2 is ambiguous; and 1. is parsed as a floating point literal.

    import scala.util.parsing.combinator.JavaTokenParsers
    object R extends JavaTokenParsers with Application{
      def RANGE = ":"
      def range_expression = value_expression~RANGE~value_expression
      def value_expression = /* other stuff eventually working down to */ literal_expression
      def literal_expression = ( stringLiteral | floatingPointNumber | wholeNumber | ident )
      println(parseAll(range_expression, "1" + RANGE + "n"))
    }

I'm using 2.7.6-final and want to define a new combinator similar to ANTLR's lookahead guard.

   (Integer "..") => Integer // Prevent 1..2 from being tokenized as 1. followed by .2

Obviously, I can't use => in Scala, but I would like to define something like

  a<~~b

which will parse a and b but reset the Input to just after where a was found. In the 2.8 trunk there is a similar guard(Parser) combinator that is used as a<~guard(b) but that is not yet available.

Currently, it is not easy to add new combinators because other parsers/combinators return type Parser which does not see new combinators. I suppose implicits may help, or http://scala.sygneca.com/patterns/pimp-my-library but something built into the framework would be better, if possible.

scabug commented 15 years ago

Imported From: https://issues.scala-lang.org/browse/SI-2420?orig=1 Reporter: @DavidBiesack

scabug commented 15 years ago

@DavidBiesack said: Adriaan Moors adriaan.moors@cs.kuleuven.be said in email

Yep, feel free to file a ticket to request this enhancement and assign it to me so it won't be forgotten.

but I can't find an Adriaan in the list of users

Changed component to Standard Library