summaryrefslogtreecommitdiff
path: root/test/files/run/packrat2.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/packrat2.scala
parent6d66470bbde99ee736c03feb04665a8fb9623985 (diff)
downloadscala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.tar.gz
scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.tar.bz2
scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.zip
packrat parsing
Diffstat (limited to 'test/files/run/packrat2.scala')
-rw-r--r--test/files/run/packrat2.scala58
1 files changed, 58 insertions, 0 deletions
diff --git a/test/files/run/packrat2.scala b/test/files/run/packrat2.scala
new file mode 100644
index 0000000000..3361552561
--- /dev/null
+++ b/test/files/run/packrat2.scala
@@ -0,0 +1,58 @@
+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 extends Application{
+ import grammars2._
+
+ val head = phrase(exp)
+
+ println(extractResult(head(new lexical.Scanner("1"))))
+ println(extractResult(head(new lexical.Scanner("1+2"))))
+ println(extractResult(head(new lexical.Scanner("9*9"))))
+ println(extractResult(head(new lexical.Scanner("4*9+7"))))
+ println(extractResult(head(new lexical.Scanner("4*9+7*2+3*3"))))
+ println(extractResult(head(new lexical.Scanner("4*9+7*2+3*3+9*5+7*6*2"))))
+ println(extractResult(head(new lexical.Scanner("4*(9+7)*(2+3)*3"))))
+
+}
+
+object grammars2 extends StandardTokenParsers with PackratParsers{
+
+ def extractResult(r : ParseResult[_]) = r match{
+ case Success(a,_) => a
+ case Failure(a,_) => a
+ case Error(a,_) => a
+ }
+
+ lexical.delimiters ++= List("+","-","*","/","(",")")
+ lexical.reserved ++= List("Hello","World")
+
+ /*
+ * exp = sum | prod | num
+ * sum = exp ~ "+" ~ num
+ * prod = exp ~ "*" ~ num
+ */
+
+ val exp : PackratParser[Int] = sum | prod | numericLit ^^{_.toInt} | "("~>exp<~")"
+ val sum : PackratParser[Int] = exp~("+"~>exp) ^^ {case x~y => x+y}
+ val prod: PackratParser[Int] = exp~("*"~>(numericLit ^^{_.toInt} | exp)) ^^ {case x~y => x*y}
+
+
+ /* lexical.reserved ++= List("a","b", "c")
+ val a : PackratParser[Any] = numericLit^^{x => primeFactors(x.toInt)}
+ val b : PackratParser[Any] = memo("b")
+ val c : PackratParser[Any] = memo("c")
+ val AnBnCn : PackratParser[Any] =
+ parseButDontEat(repMany1(a,b))~not(b)~>rep1(a)~repMany1(b,c)// ^^{case x~y => x:::y}
+ //val c : PackratParser[Any] = parseButDontEat(a)~a~a
+ //println(c((new PackratReader(new lexical.Scanner("45 24")))))
+ val r = new PackratReader(new lexical.Scanner("45 b c"))
+ println(AnBnCn(r))
+ println(r.getCache.size)
+*/
+} \ No newline at end of file