summaryrefslogtreecommitdiff
path: root/docs/examples/parsing/MiniML.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-09-16 18:01:02 +0000
committerMartin Odersky <odersky@gmail.com>2007-09-16 18:01:02 +0000
commit7fe7bace8a7a55d888f4ebdce8d778ceb4384546 (patch)
tree3d1041a517a92f2a05f48ff80be116f316aadef1 /docs/examples/parsing/MiniML.scala
parent0b2f65aa6c6b3bb3e7628720893fb8116fdc8f71 (diff)
downloadscala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.tar.gz
scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.tar.bz2
scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.zip
combinator1 parser changes + examples added
Diffstat (limited to 'docs/examples/parsing/MiniML.scala')
-rw-r--r--docs/examples/parsing/MiniML.scala52
1 files changed, 52 insertions, 0 deletions
diff --git a/docs/examples/parsing/MiniML.scala b/docs/examples/parsing/MiniML.scala
new file mode 100644
index 0000000000..ffc7c2ac92
--- /dev/null
+++ b/docs/examples/parsing/MiniML.scala
@@ -0,0 +1,52 @@
+package examples.parsing
+
+import scala.util.parsing.combinator1.syntactical.StandardTokenParsers
+import scala.util.parsing.combinator1.syntactical.StandardTokenParsers
+
+object MiniML extends StandardTokenParsers {
+ lexical.delimiters += ("(", ")", ".", "=")
+ lexical.reserved += ("lambda", "let", "in")
+
+ def expr: Parser[Any] = (
+ "let" ~ ident ~ "=" ~ expr ~ "in" ~ expr
+ | "lambda" ~ ident ~ "." ~ expr
+ | simpleExpr ~ rep(expr)
+ )
+ def simpleExpr: Parser[Any] = (
+ ident
+ | "(" ~ expr ~ ")"
+ )
+
+ def main(args: Array[String]) {
+ val tokens = new lexical.Scanner(args(0))
+ println(args(0))
+ println(phrase(expr)(tokens))
+ }
+}
+
+class Expr
+case class Let(x: String, expr: Expr, body: Expr) extends Expr
+case class Lambda(x: String, expr: Expr) extends Expr
+case class Apply(fun: Expr, arg: Expr) extends Expr
+case class Var(x: String) extends Expr
+
+object MiniML1 extends StandardTokenParsers {
+ lexical.delimiters += ("(", ")", ".", "=")
+ lexical.reserved += ("lambda", "let", "in")
+
+ def expr: Parser[Expr] = (
+ "let" ~ ident ~ "=" ~ expr ~ "in" ~ expr ^^ { case "let" ~ x ~ "=" ~ e ~ "in" ~ b => Let(x, e, b) }
+ | "lambda" ~ ident ~ "." ~ expr ^^ { case "lambda" ~ x ~ "." ~ e => Lambda(x, e) }
+ | simpleExpr ~ rep(expr) ^^ { case f ~ as => (f /: as) (Apply) }
+ )
+ def simpleExpr: Parser[Expr] = (
+ ident ^^ { Var }
+ | "(" ~> expr <~ ")"
+ )
+
+ def main(args: Array[String]) {
+ val tokens = new lexical.Scanner(args(0))
+ println(args(0))
+ println(phrase(expr)(tokens))
+ }
+}