progs/parser-combinators/comb1.sc
changeset 956 ae9782e62bdd
parent 954 eda0ccf56c72
child 959 64ec1884d860
equal deleted inserted replaced
955:47acfd7f9096 956:ae9782e62bdd
   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)))"))