summaryrefslogtreecommitdiff
path: root/test/files/run/packrat3.scala
diff options
context:
space:
mode:
authorTiark Rompf <tiark.rompf@epfl.ch>2009-05-06 14:51:51 +0000
committerTiark Rompf <tiark.rompf@epfl.ch>2009-05-06 14:51:51 +0000
commit5b1da4217f7f36eab1ba14b5b95667de5bda09ed (patch)
tree4fd8a25b8803d915445af83fec68c741fc5b2aac /test/files/run/packrat3.scala
parent6d66470bbde99ee736c03feb04665a8fb9623985 (diff)
downloadscala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.tar.gz
scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.tar.bz2
scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.zip
packrat parsing
Diffstat (limited to 'test/files/run/packrat3.scala')
-rw-r--r--test/files/run/packrat3.scala52
1 files changed, 52 insertions, 0 deletions
diff --git a/test/files/run/packrat3.scala b/test/files/run/packrat3.scala
new file mode 100644
index 0000000000..34695ef2ed
--- /dev/null
+++ b/test/files/run/packrat3.scala
@@ -0,0 +1,52 @@
+import scala.util.parsing.combinator._
+
+import scala.util.parsing.combinator.syntactical.StandardTokenParsers
+import scala.util.parsing.input._
+import scala.util.parsing.syntax._
+
+import scala.collection.mutable.HashMap
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ import grammars3._
+
+ val head = phrase(AnBnCn)
+
+ println(extractResult(head(new lexical.Scanner("a b c"))))
+ println(extractResult(head(new lexical.Scanner("a a b b c c"))))
+ println(extractResult(head(new lexical.Scanner("a a a b b b c c c"))))
+ println(extractResult(head(new lexical.Scanner("a a a a b b b b c c c c"))))
+
+ println(extractResult(head(new lexical.Scanner("a a a b b b b c c c c"))))
+ println(extractResult(head(new lexical.Scanner("a a a a b b b c c c c"))))
+ println(extractResult(head(new lexical.Scanner("a a a a b b b b c c c"))))
+ }
+}
+
+object grammars3 extends StandardTokenParsers with PackratParsers {
+
+ def extractResult(r: ParseResult[_]) = r match {
+ case Success(a,_) => a
+ case Failure(a,_) => a
+ case Error(a,_) => a
+ }
+
+
+ lexical.reserved ++= List("a","b", "c")
+ val a: PackratParser[Any] = memo("a")
+ val b: PackratParser[Any] = memo("b")
+ val c: PackratParser[Any] = memo("c")
+
+ val AnBnCn: PackratParser[Any] =
+ guard(repMany1(a,b) ~ not(b)) ~ rep1(a) ~ repMany1(b,c)// ^^{case x~y => x:::y}
+
+
+ private def repMany[T](p: => Parser[T], q: => Parser[T]): Parser[List[T]] =
+ ( p~repMany(p,q)~q ^^ {case x~xs~y => x::xs:::(y::Nil)}
+ | success(Nil)
+ )
+
+ def repMany1[T](p: => Parser[T], q: => Parser[T]): Parser[List[T]] =
+ p~opt(repMany(p,q))~q ^^ {case x~Some(xs)~y => x::xs:::(y::Nil)}
+
+}