87 P.parse_all(")(") |
87 P.parse_all(")(") |
88 P.parse_all("()") |
88 P.parse_all("()") |
89 |
89 |
90 // arithmetic expressions |
90 // arithmetic expressions |
91 lazy val E: Parser[String, String] = |
91 lazy val E: Parser[String, String] = |
92 (F ~ "*" ~ F) ==> { case ((x, y), z) => x + y + z } || F |
92 (F ~ "*" ~ T) ==> { case ((x, y), z) => x + y + z } || F |
93 lazy val F: Parser[String, String] = |
93 lazy val F: Parser[String, String] = |
94 ((T ~ "+" ~ T) ==> { case ((x, y), z) => x + y + z } || |
94 ((T ~ "+" ~ T) ==> { case ((x, y), z) => x + y + z } || |
95 (T ~ "-" ~ T) ==> { case ((x, y), z) => x + y + z } || T) |
95 (T ~ "-" ~ T) ==> { case ((x, y), z) => x + y + z } || T) |
96 lazy val T: Parser[String, String] = |
96 lazy val T: Parser[String, String] = |
97 ("(" ~ E ~ ")") ==> { case ((x, y), z) => x + y + z } || NumParser |
97 ("(" ~ E ~ ")") ==> { case ((x, y), z) => x + y + z } || NumParser |
101 println(E.parse_all("(1+2)+3")) |
101 println(E.parse_all("(1+2)+3")) |
102 println(E.parse_all("1+2+3")) // this is not parsed, because of |
102 println(E.parse_all("1+2+3")) // this is not parsed, because of |
103 // how the grammar is set up |
103 // how the grammar is set up |
104 |
104 |
105 // non-ambiguous vs ambiguous grammars |
105 // non-ambiguous vs ambiguous grammars |
106 lazy val U : Parser[String, String] = |
|
107 ("1" ~ U) ==> { case (x, y) => x + y } || "" |
|
108 |
|
109 U.parse_all("1" * 100 + "0") |
|
110 |
|
111 lazy val S : Parser[String, String] = |
106 lazy val S : Parser[String, String] = |
112 ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || "" |
107 ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || "" |
113 |
108 |
114 S.parse_all("1" * 15) |
109 S.parse_all("1" * 15) |
115 |
110 |
|
111 lazy val U : Parser[String, String] = |
|
112 ("1" ~ U) ==> { case (x, y) => x + y } || "" |
|
113 |
|
114 U.parse("11") |
|
115 U.parse("11111") |
|
116 U.parse("11011") |
|
117 |
|
118 U.parse_all("1" * 100 + "0") |
|
119 |
|
120 lazy val UCount : Parser[String, Int] = |
|
121 ("1" ~ UCount) ==> { case (x, y) => y + 1 } || |
|
122 "" ==> { (x) => 0 } |
|
123 |
|
124 UCount.parse("11111") |
|
125 UCount.parse_all("11111") |
116 |
126 |
117 |
127 |
118 |
128 |
119 |
129 |
|
130 // Single Character parser |
|
131 lazy val One : Parser[String, String] = "1" |
|
132 lazy val Two : Parser[String, String] = "2" |
120 |
133 |
|
134 One.parse("1") |
|
135 One.parse("111") |
121 |
136 |
|
137 (One ~ One).parse("111") |
|
138 (One ~ One ~ One).parse("111") |
|
139 (One ~ One ~ One ~ One).parse("1111") |
122 |
140 |
123 |
141 (One || Two).parse("111") |
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|