progs/parser-combinators/comb1.sc
changeset 955 ca67172b8fa1
parent 953 b569edaf7e43
child 958 6caee1c0222e
equal deleted inserted replaced
954:4a7ed272d46e 955:ca67172b8fa1
   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)))"))