diff options
author | Tiark Rompf <tiark.rompf@epfl.ch> | 2009-05-06 14:51:51 +0000 |
---|---|---|
committer | Tiark Rompf <tiark.rompf@epfl.ch> | 2009-05-06 14:51:51 +0000 |
commit | 5b1da4217f7f36eab1ba14b5b95667de5bda09ed (patch) | |
tree | 4fd8a25b8803d915445af83fec68c741fc5b2aac /test/files/run/packrat1.scala | |
parent | 6d66470bbde99ee736c03feb04665a8fb9623985 (diff) | |
download | scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.tar.gz scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.tar.bz2 scala-5b1da4217f7f36eab1ba14b5b95667de5bda09ed.zip |
packrat parsing
Diffstat (limited to 'test/files/run/packrat1.scala')
-rw-r--r-- | test/files/run/packrat1.scala | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/test/files/run/packrat1.scala b/test/files/run/packrat1.scala new file mode 100644 index 0000000000..69eb8c5fc9 --- /dev/null +++ b/test/files/run/packrat1.scala @@ -0,0 +1,48 @@ +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 grammars._ + + val head = phrase(term) + + println(extractResult(head(new lexical.Scanner("1")))) + println(extractResult(head(new lexical.Scanner("1+2")))) + println(extractResult(head(new lexical.Scanner("9-4")))) + println(extractResult(head(new lexical.Scanner("9*9")))) + println(extractResult(head(new lexical.Scanner("8/2")))) + println(extractResult(head(new lexical.Scanner("4*9-0/7+9-8*1")))) + println(extractResult(head(new lexical.Scanner("(1+2)*3")))) +} + +object grammars 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") + + /**** + * term = term + fact | term - fact | fact + * fact = fact * num | fact / num | num + */ + + + val term: PackratParser[Int] = (term~("+"~>fact) ^^ {case x~y => x+y} + |term~("-"~>fact) ^^ {case x~y => x-y} + |fact) + + val fact: PackratParser[Int] = (fact~("*"~>numericLit) ^^ {case x~y => x*y.toInt} + |fact~("/"~>numericLit) ^^ {case x~y => x/y.toInt} + |"("~>term<~")" + |numericLit ^^ {_.toInt}) + } |