Skip to content

Instantly share code, notes, and snippets.

@aoiroaoino
Last active December 16, 2015 04:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aoiroaoino/5378965 to your computer and use it in GitHub Desktop.
Save aoiroaoino/5378965 to your computer and use it in GitHub Desktop.
import scala.util.parsing.combinator._
abstract class AST
case class Add(left: AST, right: AST) extends AST
case class Sub(left: AST, right: AST) extends AST
case class Multi(left: AST, right: AST) extends AST
case class Div(left: AST, right: AST) extends AST
case class Num(num: Int) extends AST
class OperationParsers extends RegexParsers {
def expr: Parser[AST] = "(" ~> operator ~ (expr | num) ~ (expr | num) <~ ")" ^^ {
case o ~ l ~ r => o match {
case "+" => Add(l, r)
case "-" => Sub(l, r)
case "*" => Multi(l, r)
case "/" => Div(l, r)
}
}
def operator = "+" | "-" | "*" | "/"
def num = """-?[0-9]+""".r ^^ {case n => Num(n.toInt)}
def eval(ast: AST): Int = {
ast match {
case Num(n) => n
case Add(l, r) => eval(l) + eval(r)
case Sub(l, r) => eval(l) - eval(r)
case Multi(l, r) => eval(l) * eval(r)
case Div(l, r) => eval(l) / eval(r)
}
}
def parser(str: String) = parseAll(expr, str) match {
case Success(v, _) => println(eval(v))
case Failure(msg, _) => println(msg)
case Error(msg, _) => println(msg)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment