equal
deleted
inserted
replaced
|
1 //:load parser3.scala |
|
2 |
|
3 case class StringParser(s: String) extends Parser[String, String] { |
|
4 def parse(ts: String) = { |
|
5 if (s.length <= ts.length && ts.startsWith(s)) Set((s, ts.drop(s.length))) |
|
6 else Set() |
|
7 } |
|
8 } |
|
9 |
|
10 implicit def string2parser(s: String) = StringParser(s) |
|
11 |
|
12 def time_needed[T](i: Int, code: => T) = { |
|
13 val start = System.nanoTime() |
|
14 for (j <- 1 to i) code |
|
15 val end = System.nanoTime() |
|
16 (end - start)/(i * 1.0e9) |
|
17 } |
|
18 |
|
19 // unambiguous grammar |
|
20 |
|
21 lazy val U: Parser[String, String] = |
|
22 ("1" ~ U) ==> { case (x, y) => "1" + y} || "" |
|
23 |
|
24 def test1(i: Int) = { |
|
25 val result = U.parse_all("1" * i) |
|
26 //print(result.size + " ") |
|
27 } |
|
28 |
|
29 for (i <- 1 to 1000 by 50) { |
|
30 print(i + " ") |
|
31 print("%.5f".format(time_needed(1, test1(i)))) |
|
32 print("\n") |
|
33 } |
|
34 |
|
35 |
|
36 |
|
37 // ambiguous grammar |
|
38 // n = 16 -> over 35 million parse trees |
|
39 |
|
40 lazy val S: Parser[String, String] = |
|
41 ("1" ~ S ~ S) ==> { case ((x, y), z) => "1" + y + z} || "" |
|
42 |
|
43 def test2(i: Int) = { |
|
44 val result = S.parse_all("1" * i) |
|
45 print(result.size + " ") |
|
46 } |
|
47 |
|
48 for (i <- 1 to 30) { |
|
49 print(i + " ") |
|
50 print("%.5f".format(time_needed(1, test2(i)))) |
|
51 print("\n") |
|
52 } |