summaryrefslogtreecommitdiff
path: root/docs/examples/parsing
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2007-07-17 20:49:24 +0000
committerAdriaan Moors <adriaan.moors@epfl.ch>2007-07-17 20:49:24 +0000
commitc5c6d4a8ce75993d2dcd80f6360b45de534a3f41 (patch)
treea4502a0bf95b9bf8904936b0bdb8eb4cd34b558f /docs/examples/parsing
parent31b6dbf1c50b4b6fe3664691403e694de6a01513 (diff)
downloadscala-c5c6d4a8ce75993d2dcd80f6360b45de534a3f41.tar.gz
scala-c5c6d4a8ce75993d2dcd80f6360b45de534a3f41.tar.bz2
scala-c5c6d4a8ce75993d2dcd80f6360b45de534a3f41.zip
updated examples to new combinator library
Diffstat (limited to 'docs/examples/parsing')
-rw-r--r--docs/examples/parsing/ArithmeticParser.scala57
-rw-r--r--docs/examples/parsing/ListParser.scala33
2 files changed, 90 insertions, 0 deletions
diff --git a/docs/examples/parsing/ArithmeticParser.scala b/docs/examples/parsing/ArithmeticParser.scala
new file mode 100644
index 0000000000..2aac4b6f6c
--- /dev/null
+++ b/docs/examples/parsing/ArithmeticParser.scala
@@ -0,0 +1,57 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2006-2007, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package examples.parsing
+
+import scala.util.parsing.combinator.lexical.StdLexical
+import scala.util.parsing.combinator.syntactical.StdTokenParsers
+
+/** Parse and evaluate a numeric expression as a sequence of terms, separated by + or -
+ * a term is a sequence of factors, separated by * or /
+ * a factor is a parenthesized expression or a number
+ *
+ * @author Adriaan Moors
+ */
+object arithmeticParser extends StdTokenParsers {
+ type Tokens = StdLexical ; val lexical = new StdLexical
+ lexical.delimiters ++= List("(", ")", "+", "-", "*", "/")
+
+ lazy val expr = term*("+" ^^ {(x: int, y: int) => x + y} | "-" ^^ {(x: int, y: int) => x - y})
+ lazy val term = factor*("*" ^^ {(x: int, y: int) => x * y} | "/" ^^ {(x: int, y: int) => x / y})
+ lazy val factor: Parser[int] = "(" ~ expr ~ ")" | numericLit ^^ (_.toInt)
+
+ def main(args: Array[String]) {
+ println(
+ if (args.length == 1) {
+ expr(new lexical.Scanner(args(0)))
+ }
+ else
+ "usage: scala examples.parsing.arithmeticParser <expr-string>"
+ )
+ }
+}
+
+
+object arithmeticParserDesugared extends StdTokenParsers {
+ type Tokens = StdLexical ; val lexical = new StdLexical
+ lexical.delimiters ++= List("(", ")", "+", "-", "*", "/")
+
+ lazy val expr = chainl1(term, (keyword("+").^^{(x: int, y: int) => x + y}).|(keyword("-").^^{(x: int, y: int) => x - y}))
+ lazy val term = chainl1(factor, (keyword("*").^^{(x: int, y: int) => x * y}).|(keyword("/").^^{(x: int, y: int) => x / y}))
+ lazy val factor: Parser[int] = keyword("(").~(expr.~(keyword(")"))).|(numericLit.^^(x => x.toInt))
+
+ def main(args: Array[String]) {
+ println(
+ if (args.length == 1) {
+ expr(new lexical.Scanner(args(0)))
+ }
+ else
+ "usage: scala examples.parsing.arithmeticParser <expr-string>"
+ )
+ }
+} \ No newline at end of file
diff --git a/docs/examples/parsing/ListParser.scala b/docs/examples/parsing/ListParser.scala
new file mode 100644
index 0000000000..65354482f3
--- /dev/null
+++ b/docs/examples/parsing/ListParser.scala
@@ -0,0 +1,33 @@
+package examples.parsing
+
+import scala.util.parsing.combinator.{Parsers, ImplicitConversions, ~, mkTilde}
+import scala.util.parsing.input.CharArrayReader
+
+object listParser {
+ abstract class Tree
+ case class Id(s: String) extends Tree
+ case class Num(n: Int) extends Tree
+ case class Lst(elems: List[Tree]) extends Tree
+
+ import Character.{isLetter, isLetterOrDigit, isDigit}
+ def mkString(cs: List[Any]) = cs.mkString("")
+
+ class ListParsers extends Parsers {
+ type Elem = Char
+
+ lazy val ident = rep1(elem("letter", isLetter), elem("letter or digit", isLetterOrDigit)) ^^ {cs => Id(mkString(cs))}
+ lazy val number = chainl1(elem("digit", isDigit) ^^ (_ - '0'), success ^^ {(accum: Int, d: Int) => accum * 10 + d}) ^^ Num
+ lazy val list = '(' ~ repsep(expr, ',') ~ ')' ^^ Lst
+ lazy val expr: Parser[Tree] = list | ident | number
+ }
+
+ def main(args: Array[String]) {
+ println(
+ if (args.length == 1) {
+ (new ListParsers).expr(new CharArrayReader(args(0).toCharArray()))
+ }
+ else
+ "usage: scala examples.parsing.listParser <list-string>"
+ )
+ }
+}