equal
deleted
inserted
replaced
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] = |
14 for ((head, tail) <- parse(ts); |
14 for ((head, tail) <- parse(ts); |
15 if (tail.isEmpty)) yield head |
15 if tail.isEmpty) yield head |
16 } |
16 } |
17 |
17 |
18 class SeqParser[I : IsSeq, T, S](p: => Parser[I, T], |
18 class SeqParser[I : IsSeq, T, S](p: => Parser[I, T], |
19 q: => Parser[I, S]) extends Parser[I, (T, S)] { |
19 q: => Parser[I, S]) extends Parser[I, (T, S)] { |
20 def parse(sb: I) = |
20 def parse(sb: I) = |
160 NumParserInt) |
160 NumParserInt) |
161 |
161 |
162 //println(EL.parse_all("1+2+3")) |
162 //println(EL.parse_all("1+2+3")) |
163 |
163 |
164 |
164 |
165 |
|
166 |
|
167 // non-ambiguous vs ambiguous grammars |
165 // non-ambiguous vs ambiguous grammars |
168 |
166 |
169 // ambiguous |
167 // ambiguous |
170 lazy val S : Parser[String, String] = |
168 lazy val S : Parser[String, String] = |
171 ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || "" |
169 ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || "" |
203 (One ~ One).parse("111") |
201 (One ~ One).parse("111") |
204 (One ~ One ~ One).parse("111") |
202 (One ~ One ~ One).parse("111") |
205 (One ~ One ~ One ~ One).parse("1111") |
203 (One ~ One ~ One ~ One).parse("1111") |
206 |
204 |
207 (One || Two).parse("111") |
205 (One || Two).parse("111") |
208 |
|
209 |
|
210 |
206 |
211 |
207 |
212 // a problem with the arithmetic expression parser -> gets |
208 // a problem with the arithmetic expression parser -> gets |
213 // slow with deep nestedness |
209 // slow with deep nestedness |
214 E.parse("1") |
210 E.parse("1") |