97 lazy val T: Parser[String, Int] = |
97 lazy val T: Parser[String, Int] = |
98 (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } | F |
98 (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } | F |
99 lazy val F: Parser[String, Int] = |
99 lazy val F: Parser[String, Int] = |
100 ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParserInt |
100 ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParserInt |
101 |
101 |
|
102 lazy val E: Parser[String, String] = |
|
103 (T ~ "+" ~ E) ==> { case ((x, y), z) => "(" + x + ")+(" + z + ")"} | T |
|
104 lazy val T: Parser[String, String] = |
|
105 (F ~ "*" ~ T) ==> { case ((x, y), z) => "(" + x + ")*("+ z + ")"} | F |
|
106 lazy val F: Parser[String, String] = |
|
107 ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParser |
102 |
108 |
|
109 println(E.parse_all("1+3+4")) |
|
110 println(E.parse("1+3+4")) |
103 println(E.parse_all("4*2+3")) |
111 println(E.parse_all("4*2+3")) |
104 println(E.parse_all("4*(2+3)")) |
112 println(E.parse_all("4*(2+3)")) |
105 println(E.parse_all("(4)*((2+3))")) |
113 println(E.parse_all("(4)*((2+3))")) |
106 println(E.parse_all("4/2+3")) |
114 println(E.parse_all("4/2+3")) |
107 println(E.parse("1 + 2 * 3")) |
115 println(E.parse("1 + 2 * 3")) |
124 |
132 |
125 // non-ambiguous vs ambiguous grammars |
133 // non-ambiguous vs ambiguous grammars |
126 lazy val S : Parser[String, String] = |
134 lazy val S : Parser[String, String] = |
127 ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } | "" |
135 ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } | "" |
128 |
136 |
129 S.parse("1" * 15) |
137 S.parse("1" * 17) |
130 |
138 |
131 lazy val U : Parser[String, String] = |
139 lazy val U : Parser[String, String] = |
132 ("1" ~ U) ==> { case (x, y) => x + y } | "" |
140 ("1" ~ U) ==> { case (x, y) => x + y } | "" |
133 |
141 |
134 U.parse("1" * 15) |
142 U.parse("1" * 25) |
135 |
143 |
136 U.parse("11") |
144 U.parse("11") |
137 U.parse("11111") |
145 U.parse("11111") |
138 U.parse("11011") |
146 U.parse("11011") |
139 |
147 |