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)))")) |