diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2007-07-17 20:49:24 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2007-07-17 20:49:24 +0000 |
commit | c5c6d4a8ce75993d2dcd80f6360b45de534a3f41 (patch) | |
tree | a4502a0bf95b9bf8904936b0bdb8eb4cd34b558f /docs/examples/parsing/ListParser.scala | |
parent | 31b6dbf1c50b4b6fe3664691403e694de6a01513 (diff) | |
download | scala-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.scala | 33 |
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>" + ) + } +} |