progs/comb1.scala
changeset 362 57ea439feaff
parent 360 c6c574d2ca0c
child 366 5a83336a9690
--- a/progs/comb1.scala	Fri Oct 23 08:35:17 2015 +0100
+++ b/progs/comb1.scala	Fri Oct 23 14:45:57 2015 +0100
@@ -1,6 +1,10 @@
 import scala.language.implicitConversions
 import scala.language.reflectiveCalls
 
+/* Note, in the lectures I did not show the type consraint
+ * I <% Seq[_] , which means that the input type I can be
+ * treated, or seen, as a sequence. */
+
 abstract class Parser[I <% Seq[_], T] {
   def parse(ts: I): Set[(T, I)]
 
@@ -67,20 +71,21 @@
     new SeqParser[String, String, String](s, r)
 }
 
-// palindromes
+// a parse palindromes
 lazy val Pal : Parser[String, String] = 
   (("a" ~ Pal ~ "a") ==> { case ((x, y), z) => x + y + z } ||
    ("b" ~ Pal ~ "b") ==> { case ((x, y), z) => x + y + z } || "")
 
 println("Palindrom: " + Pal.parse_all("ababbaba"))
 
-// well-nested parenthesis
+// well-nested parenthesis parser
 lazy val P : Parser[String, String] = 
   "(" ~ P ~ ")" ~ P ==> { case (((u, x), y), z) => "{" + x + "}" + z } || ""
 
 P.parse_all("(((()()))())")
 P.parse_all("(((()()))()))")
 P.parse_all(")(")
+P.parse_all("()")
 
 // arithmetic expressions
 lazy val E: Parser[String, String] = 
@@ -93,10 +98,11 @@
 
 println(E.parse_all("1*2+3"))
 println(E.parse_all("1+2*3"))
-println(E.parse_all("1+2+3"))
+println(E.parse_all("(1+2)+3"))
+println(E.parse_all("1+2+3"))  // this is not parsed, because of 
+                               // how the grammar is set up
 
-
-// non-ambiguous vs ambiguous
+// non-ambiguous vs ambiguous grammars
 lazy val U : Parser[String, String] =
   ("1" ~ U) ==> { case (x, y) => x + y } || ""
 
@@ -106,3 +112,32 @@
   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || ""
 
 S.parse_all("1" * 15)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+