summaryrefslogtreecommitdiff
path: root/sources/examples/parsers2.scala
diff options
context:
space:
mode:
authormichelou <michelou@epfl.ch>2004-05-05 08:39:38 +0000
committermichelou <michelou@epfl.ch>2004-05-05 08:39:38 +0000
commit5d65d5689a81150ff003b165dc7caf458401180c (patch)
treeb648e99e621761bf92804522887f92c839145924 /sources/examples/parsers2.scala
parentce49391c0b7cbcfe0c4dee1106264017f3f2d3b1 (diff)
downloadscala-5d65d5689a81150ff003b165dc7caf458401180c.tar.gz
scala-5d65d5689a81150ff003b165dc7caf458401180c.tar.bz2
scala-5d65d5689a81150ff003b165dc7caf458401180c.zip
- renamed 'parsers1.scala' to 'parsers2.scala'.
Diffstat (limited to 'sources/examples/parsers2.scala')
-rw-r--r--sources/examples/parsers2.scala63
1 files changed, 63 insertions, 0 deletions
diff --git a/sources/examples/parsers2.scala b/sources/examples/parsers2.scala
new file mode 100644
index 0000000000..ee830b894f
--- /dev/null
+++ b/sources/examples/parsers2.scala
@@ -0,0 +1,63 @@
+package examples;
+
+object parsers2 {
+
+ 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 {}
+
+ abstract class ListParsers extends CharParsers {
+
+ def ident: Parser[Tree] =
+ for (
+ val c: char <- chr(Character.isLetter);
+ val cs: List[char] <- rep(chr(Character.isLetterOrDigit))
+ ) yield Id((c :: cs).mkString("", "", ""));
+
+ def number: Parser[Tree] =
+ for (
+ val d: char <- chr(Character.isDigit);
+ val ds: List[char] <- rep(chr(Character.isDigit))
+ ) yield Num(((d - '0') /: ds) ((x, digit) => x * 10 + digit - '0'));
+
+ def list: Parser[Tree] =
+ for (
+ val _ <- chr('(');
+ val es <- listElems ||| succeed(List());
+ val _ <- chr(')')
+ ) yield Lst(es);
+
+ def listElems: Parser[List[Tree]] =
+ for (
+ val x <- expr;
+ val xs <- chr(',') &&& listElems ||| succeed(List())
+ ) yield x :: xs;
+
+ def expr: Parser[Tree] =
+ list ||| ident ||| number;
+
+ }
+
+ class ParseString(s: String) extends Parsers {
+ type intype = int;
+ val input = 0;
+ def any = new Parser[char] {
+ def apply(in: int): Parser[char]#Result =
+ if (in < s.length()) Some(Pair(s charAt in, in + 1)) else None;
+ }
+ }
+
+ def main(args: Array[String]): unit =
+ Console.println(
+ if (args.length == 1) {
+ val ps = new ListParsers with ParseString(args(0));
+ ps.expr(ps.input) match {
+ case Some(Pair(list, _)) => Console.println("parsed: " + list);
+ case None => "nothing parsed"
+ }
+ } else "usage: java examples.parsers2 <expr-string>"
+ );
+
+}
+