简体   繁体   中英

Add more parser combinators

Is it possible to extend the Scala Parser Combinator library with more Parser Combinators, maybe with the help of a wrapper? I am trying to add a new Parser Combinator with a custom behavior. My current solution is to adopt the files ( Parsers.scala , RegexParsers.scala , and SubSequence.scala ) and to add my custom Parser Combinators directly.

EDIT

With the help of an old Gitter message , I got following solution:

import scala.util.parsing.combinator._

trait JustTesting extends RegexParsers {

  def test = "a" abc "b"

  abstract class TestParser[T] extends Parser[T] {

    def abc[U](q: ⇒ Parser[U]): Parser[U] = { // same behaviour as ~
      lazy val p = q // lazy argument
      (for (a ← this; b ← p) yield b).named("abc")
    }

  }

  override implicit def literal(s: String): TestParser[String] =
    super.literal(s).asInstanceOf[TestParser[String]] // Runtime error, because a convert is not possible

}

Is that the way to go? Is it possible to change the implementation so that I do not need to override the literal function? A problem is also that I cannot use "a" abc "b" abc "c" .

There are a number of subclasses of Parser in the scala-parser-combinator library. You can basically just follow the examples.

eg these all extend Parser: https://github.com/scala/scala-parser-combinators/tree/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/syntactical

And JavaTokenParsers extends RegexParsers: https://github.com/scala/scala-parser-combinators/blob/1.0.x/shared/src/main/scala/scala/util/parsing/combinator/JavaTokenParsers.scala

Here's another random example from the web, with a concrete object extending the trait: https://github.com/droby/expression-parser/blob/master/src/main/scala/com/donroby/parsing/ExpressionParsers.scala

There are many blogs you can find showing how to use the library.

In general, extending a class just requires writing class MyClass extends ClassToExtend{} and then implementing any abstract methods until the compiler stops complaining.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM