|     77 // a parse palindromes |     77 // a parse palindromes | 
|     78 lazy val Pal : Parser[String, String] =  |     78 lazy val Pal : Parser[String, String] =  | 
|     79   (("a" ~ Pal ~ "a") ==> { case ((x, y), z) => x + y + z } || |     79   (("a" ~ Pal ~ "a") ==> { case ((x, y), z) => x + y + z } || | 
|     80    ("b" ~ Pal ~ "b") ==> { case ((x, y), z) => x + y + z } || "a" || "b" || "") |     80    ("b" ~ Pal ~ "b") ==> { case ((x, y), z) => x + y + z } || "a" || "b" || "") | 
|     81  |     81  | 
|         |     82 Pal.parse_all("abaaaba") | 
|         |     83  | 
|     82 println("Palindrome: " + Pal.parse_all("abaaaba")) |     84 println("Palindrome: " + Pal.parse_all("abaaaba")) | 
|     83  |     85  | 
|     84 // well-nested parenthesis parser |     86 // well-nested parenthesis parser | 
|     85 lazy val P : Parser[String, String] =  |     87 lazy val P : Parser[String, String] =  | 
|     86   "(" ~ P ~ ")" ~ P ==> { case (((u, x), y), z) => "{" + x + "}" + z } || "" |     88   "(" ~ P ~ ")" ~ P ==> { case (((u, x), y), z) => "{" + x + "}" + z } || "" | 
|     89 P.parse_all("(((()()))()))") |     91 P.parse_all("(((()()))()))") | 
|     90 P.parse_all(")(") |     92 P.parse_all(")(") | 
|     91 P.parse_all("()") |     93 P.parse_all("()") | 
|     92  |     94  | 
|     93 // arithmetic expressions |     95 // arithmetic expressions | 
|         |     96  | 
|     94 lazy val E: Parser[String, Int] =  |     97 lazy val E: Parser[String, Int] =  | 
|     95   (T ~ "+" ~ E) ==> { case ((x, y), z) => x + z } || |     98   (T ~ "+" ~ E) ==> { case ((x, y), z) => x + z } || | 
|     96   (T ~ "-" ~ E) ==> { case ((x, y), z) => x - z } || T  |     99   (T ~ "-" ~ E) ==> { case ((x, y), z) => x - z } || T  | 
|     97 lazy val T: Parser[String, Int] =  |    100 lazy val T: Parser[String, Int] =  | 
|     98   ((F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } || F) |    101   ((F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } || F) | 
|     99 lazy val F: Parser[String, Int] =  |    102 lazy val F: Parser[String, Int] =  | 
|    100   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } || NumParser |    103   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } || NumParser | 
|    101  |    104  | 
|         |    105  | 
|    102 println(E.parse("4*2+3")) |    106 println(E.parse("4*2+3")) | 
|    103 println(E.parse_all("4*2+3")) |    107 println(E.parse_all("4/2+3")) | 
|    104 println(E.parse("1 + 2 * 3")) |    108 println(E.parse("1 + 2 * 3")) | 
|    105 println(E.parse_all("(1+2)+3")) |    109 println(E.parse_all("(1+2)+3")) | 
|    106 println(E.parse_all("1+2+3"))   |    110 println(E.parse_all("1+2+3"))   | 
|         |    111  | 
|         |    112  | 
|    107  |    113  | 
|    108 // no left-recursion allowed, otherwise will loop |    114 // no left-recursion allowed, otherwise will loop | 
|    109 lazy val EL: Parser[String, Int] =  |    115 lazy val EL: Parser[String, Int] =  | 
|    110   ((EL ~ "+" ~ EL) ==> { case ((x, y), z) => x + z} ||  |    116   ((EL ~ "+" ~ EL) ==> { case ((x, y), z) => x + z} ||  | 
|    111    (EL ~ "*" ~ EL) ==> { case ((x, y), z) => x * z} || |    117    (EL ~ "*" ~ EL) ==> { case ((x, y), z) => x * z} || |