プログラミングhaskell 8章 version scala 〜後半〜

前半はこちら

def token[T](p: Parser[T]): Parser[T] =
  for {
    _ <- space
    v <- p
    _ <- space
  } yield v

def identifier: Parser[String] = token(ident)
def natural: Parser[Int] = token(nat)
def symbol(s: String): Parser[String] = token(string(s))

println((for {
  _  <- symbol("[")
  n  <- natural
  nx <- many(for {
         _  <- symbol(",")
         lr <- natural
        } yield lr)
  _  <- symbol("]")
} yield n :: nx).run("    [     1,   2, 3,4,   5 ]"))

def expr: Parser[Int] =
  for {
    t <- term
    r <- (for {
           _ <- symbol("+")
           e <- expr
         } yield t + e) +++
         (for {
           _ <- symbol("-")
           e <- expr
         } yield t - e) +++ pure(t)
  } yield r

def term: Parser[Int] =
  for {
    f <- factor
    r <- (for {
            _ <- symbol("*")
            t <- term
          } yield f * t) +++
         (for {
            _ <- symbol("/")
            t <- term
          } yield f / t) +++ pure(f)
  } yield r

def factor: Parser[Int] =
  (for {
    _ <- symbol("(")
    e <- expr
    _ <- symbol(")")
  } yield e) +++ natural

def eval(s: String): Int =
  expr.run(s).map(_._2).get

println(eval("2*3+4"))
println(eval("2*(3+4)"))
println(eval("(1 + 2) * (7 - 2) / 5"))