147 println(P.parse_all(")(")) |
147 println(P.parse_all(")(")) |
148 println(P.parse_all("()")) |
148 println(P.parse_all("()")) |
149 |
149 |
150 // A parser for arithmetic expressions (Terms and Factors) |
150 // A parser for arithmetic expressions (Terms and Factors) |
151 |
151 |
152 "1 + 2 * 3" |
|
153 "(1 + 2) * 3" |
|
154 { |
|
155 lazy val E: Parser[String, Int] = { |
152 lazy val E: Parser[String, Int] = { |
156 (T ~ p"+" ~ E).map{ case ((x, _), z) => x + z } || |
153 (T ~ p"+" ~ E).map{ case ((x, _), z) => x + z } || |
157 (T ~ p"-" ~ E).map{ case ((x, _), z) => x - z } || T } |
154 (T ~ p"-" ~ E).map{ case ((x, _), z) => x - z } || T } |
158 lazy val T: Parser[String, Int] = { |
155 lazy val T: Parser[String, Int] = { |
159 (F ~ p"*" ~ T).map{ case ((x, _), z) => x * z } || F } |
156 (F ~ p"*" ~ T).map{ case ((x, _), z) => x * z } || F } |
160 lazy val F: Parser[String, Int] = { |
157 lazy val F: Parser[String, Int] = { |
161 (p"(" ~ E ~ p")").map{ case ((_, y), _) => y } || NumParserInt } |
158 (p"(" ~ E ~ p")").map{ case ((_, y), _) => y } || NumParserInt } |
162 } |
159 |
|
160 println(E.parse_all("2*2*2")) |
163 println(E.parse_all("1+3+4")) |
161 println(E.parse_all("1+3+4")) |
164 println(E.parse("1+3+4")) |
162 println(E.parse("1+3+4")) |
165 println(E.parse_all("4*2+3")) |
163 println(E.parse_all("4*2+3")) |
166 println(E.parse_all("4*(2+3)")) |
164 println(E.parse_all("4*(2+3)")) |
167 println(E.parse_all("(4)*(((2+3)))")) |
165 println(E.parse_all("(4)*(((2+3)))")) |