Arithmetic evaluation: Difference between revisions

m (→‎Icon and Unicon: header simplification)
Line 1,998:
is practically non-existent, to avoid obscuring the code.
 
<lang scala>package org.rosetta.arithmetic_evaluator.scala
package org.rosetta.arithmetic_evaluator.scala
 
object ArithmeticParser extends scala.util.parsing.combinator.RegexParsers {
 
def readExpression(input: String) : Option[()=>_Int] = {
parseAll(expr, input) match {
case Success(result, _) =>
Some(result)
case other =>
println(other)
None
}
}
 
private typedef ASTexpr =: Parser[()=>Int] = {
(term<~"+")~expr ^^ { case "+"l~r => () => l() + r() } |
(term<~"-")~expr ^^ { case "-"l~r => () => l() - r() } |
}term
}
 
private def exprterm : Parser[AST()=>Int] = {
(termfactor<~("+" | "-*")~exprterm ^^ toExpr{ case l~r => () |=> terml() * r() } |
(factor<~"/")~term ^^ { case "/"l~r => () => l() / r() } |
factor
}
 
private def termfactor : Parser[AST()=>Int] = {
"("~>expr<~")" |
(factor~("*" | "/")~term ^^ toExpr) | factor
"\\d+".r ^^ { x => () => x.toInt } |
 
"("~> expr <~")" | digits ^^ toLiteral | failure("Expected a value")
private def factor : Parser[AST] =
"("~> expr <~")" | digits ^^ toLiteral | failure("Expected a value")
 
private def digits =
"\\d+".r
 
private def toLiteral(partialResult: String) =
() => partialResult.toInt
 
private def toExpr(partialResult: ~[~[AST, String], AST]) = {
partialResult match {
case (l~op)~r =>
op match {
case "+" => () => l() + r()
case "-" => () => l() - r()
case "*" => () => l() * r()
case "/" => () => l() / r()
case x => error("Unknown operation " + x + ".")
}
}
}
}
Line 2,055 ⟶ 2,044:
} while (input != "q")
}
}
}</lang>
 
Example:
Anonymous user