summaryrefslogtreecommitdiff
path: root/docs/examples/parsing/ListParser.scala
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/ListParser.scala
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/ListParser.scala')
-rw-r--r--docs/examples/parsing/ListParser.scala33
1 files changed, 33 insertions, 0 deletions
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>"
+ )
+ }
+}