Skip to content

Instantly share code, notes, and snippets.

@shigemk2
Created July 20, 2015 10:04
Show Gist options
  • Select an option

  • Save shigemk2/62fd8af0c06a540aa224 to your computer and use it in GitHub Desktop.

Select an option

Save shigemk2/62fd8af0c06a540aa224 to your computer and use it in GitHub Desktop.
def ifn(str: String): Int = expr(str.split(" ").toList)._1
// expr := term ["+"|"-" expr]
def expr(src: List[String]): (Int, List[String]) = {
//println(s"[expr] src: $src")
val (v1, src2) = term(src)
src2 match {
case "+"::src3 => {
val (v2, src4) = expr(src3)
(v1 + v2, src4)
}
case "-"::src3 => {
val (v2, src4) = expr(src3)
(v1 - v2, src4)
}
case _ => (v1, src2)
}
}
// term := num ["*"|"/" term]
def term(src: List[String]): (Int, List[String]) = {
//println(s"[term] src: $src")
val num = src.head.toInt
src.tail match {
case "*"::src2 => {
val (num2, src3) = term(src2)
(num * num2, src3)
}
case "/"::src2 => {
val (num2, src3) = term(src2)
(num / num2, src3)
}
case src2 => (num, src2)
}
}
def test(src: String) = println(src + " = " + ifn(src))
test("1")
test("1 + 2")
test("1 + 2 + 3 + 4")
test("1 * 2 * 3")
test("1 + 2 * 3")
test("1 * 2 + 3")
test("2 * 3 * 4")
test("2 + 3 * 4")
test("2 * 3 + 4")
test("5 - 2")
test("1 - 2 - 3")
test("2 * 3 - 4 * 5 * 6 - 7 * 8")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment