progs/parser-combinators/comb2.sc
changeset 742 b5b5583a3a08
parent 732 c7bdd7eac4cb
child 803 d4fb8c7fc3bf
--- a/progs/parser-combinators/comb2.sc	Mon Jul 27 11:02:48 2020 +0100
+++ b/progs/parser-combinators/comb2.sc	Thu Jul 30 13:50:54 2020 +0100
@@ -1,18 +1,28 @@
-// Parser Combinators: Simple Version
+// Parser Combinators:
+// Simple Version for WHILE-language
 //====================================
+//
+// with some added convenience for
+// map-parsers and grammar rules
+//
+// call with
+//
+//    amm comb2.sc
 
 
-// more convenience for the map parsers later on
+
+
+// more convenience for the map parsers later on;
+// it allows writing nested patterns as
+// case x ~ y ~ z => ...
+
 case class ~[+A, +B](_1: A, _2: B)
 
-/* 
-  Note, in the lectures I did not show the implicit type constraint
-  I : IsSeq, which means that the input type 'I' needs to be
-  a sequence. 
-*/
 
+// constraint for the input
 type IsSeq[A] = A => Seq[_]
 
+
 abstract class Parser[I : IsSeq, T]{
   def parse(in: I): Set[(T, I)]
 
@@ -141,7 +151,7 @@
    (p"false".map[BExp]{ _ => False }) ||
    (p"(" ~ BExp ~ p")").map[BExp]{ case _ ~ x ~ _ => x }
 
-// statement 
+// a single statement 
 lazy val Stmt: Parser[String, Stmt] =
   ((p"skip".map[Stmt]{_ => Skip }) ||
    (IdParser ~ p":=" ~ AExp).map[Stmt]{ case x ~ _ ~ z => Assign(x, z) } ||
@@ -223,7 +233,7 @@
 def eval(bl: Block) : Env = eval_bl(bl, Map())
 
 // parse + evaluate fib program; then lookup what is
-// stored under the variable result 
+// stored under the variable "result" 
 println(eval(Stmts.parse_all(fib).head)("result"))
 
 
@@ -243,6 +253,7 @@
 
 println(eval(Stmts.parse_all(factors).head))
 
+
 // calculate all prime numbers up to a number 
 println("Primes")