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} || |