equal
deleted
inserted
replaced
3 |
3 |
4 /* Note, in the lectures I did not show the implicit type |
4 /* Note, in the lectures I did not show the implicit type |
5 * constraint IsSeq, which means that the input type 'I' needs |
5 * constraint IsSeq, which means that the input type 'I' needs |
6 * to be a sequence. */ |
6 * to be a sequence. */ |
7 |
7 |
8 type IsSeq[A] = A => Seq[_] |
8 type IsSeq[A] = A => Seq[_] |
9 |
9 |
10 abstract class Parser[I : IsSeq, T] { |
10 abstract class Parser[I : IsSeq, T] { |
11 def parse(ts: I): Set[(T, I)] |
11 def parse(ts: I): Set[(T, I)] |
12 |
12 |
13 def parse_all(ts: I) : Set[T] = |
13 def parse_all(ts: I) : Set[T] = |
82 lazy val Pal : Parser[String, String] = |
82 lazy val Pal : Parser[String, String] = |
83 (("a" ~ Pal ~ "a") ==> { case ((x, y), z) => x + y + z } || |
83 (("a" ~ Pal ~ "a") ==> { case ((x, y), z) => x + y + z } || |
84 ("b" ~ Pal ~ "b") ==> { case ((x, y), z) => x + y + z } || "a" || "b" || "") |
84 ("b" ~ Pal ~ "b") ==> { case ((x, y), z) => x + y + z } || "a" || "b" || "") |
85 |
85 |
86 Pal.parse_all("abaaaba") |
86 Pal.parse_all("abaaaba") |
|
87 Pal.parse_all("abacba") |
87 Pal.parse("abaaaba") |
88 Pal.parse("abaaaba") |
88 |
89 |
89 println("Palindrome: " + Pal.parse_all("abaaaba")) |
90 println("Palindrome: " + Pal.parse_all("abaaaba")) |
90 |
91 |
91 // well-nested parentheses parser (transforms '(' -> '{' , ')' -> '}' ) |
92 // well-nested parentheses parser (transforms '(' -> '{' , ')' -> '}' ) |
94 |
95 |
95 P.parse_all("(((()()))())") |
96 P.parse_all("(((()()))())") |
96 P.parse_all("(((()()))()))") |
97 P.parse_all("(((()()))()))") |
97 P.parse_all(")(") |
98 P.parse_all(")(") |
98 P.parse_all("()") |
99 P.parse_all("()") |
|
100 |
|
101 lazy val PC : Parser[String, Int] = |
|
102 ("(" ~ PC ~ ")" ~ PC ==> { case (((_, x), _), y) => x + y + 2 } || |
|
103 "" ==> { (s) => 0 }) |
|
104 |
|
105 PC.parse_all("(((()()))())") |
|
106 P.parse_all("(((()()))()))") |
99 |
107 |
100 // Arithmetic Expressions (Terms and Factors) |
108 // Arithmetic Expressions (Terms and Factors) |
101 |
109 |
102 lazy val E: Parser[String, Int] = |
110 lazy val E: Parser[String, Int] = |
103 (T ~ "+" ~ E) ==> { case ((x, y), z) => x + z } || |
111 (T ~ "+" ~ E) ==> { case ((x, y), z) => x + z } || |