fork(3) download
  1. import scala.util.parsing.combinator._
  2. import scala.util.parsing.combinator.JavaTokenParsers
  3.  
  4. object Main extends App {
  5. case class DataRecord(val doubleValue1 : Double, val doubleValue2 : Double )
  6.  
  7. type D = Double
  8. type Extractor[Double] = DataRecord => Double
  9.  
  10. object ArithParser extends JavaTokenParsers {
  11. //arithmic expression
  12. def arithmicExpr: Parser[Extractor[D]] = plus
  13. def plus: Parser[Extractor[D]] = repsep(times, "+") ^^ { summands : List[Extractor[D]] =>
  14. (in : DataRecord) => summands.map((e : Extractor[D]) => e(in)).foldLeft(0d)(_ + _)
  15. }
  16. def times: Parser[Extractor[D]] = repsep(division, "*") ^^ { factors : List[Extractor[D]] =>
  17. (in : DataRecord) => factors.map((e : Extractor[D]) => e(in)).foldLeft(1d)(_ * _)
  18. }
  19.  
  20. def division : Parser[Extractor[D]] = rep1sep(number, "/") ^^ {divisons : List[Extractor[D]] =>
  21. (in : DataRecord) => divisons.map((e : Extractor[D]) => e(in)).reduce(_ / _)
  22. } | number
  23. def number : Parser[Extractor[D]] = fpn | intExtractor
  24. def fpn: Parser[Extractor[D]] = floatingPointNumber ^^ (s => Function.const(s.toDouble)_)
  25. def intExtractor: Parser[Extractor[D]] = ("doubleValue1" | "doubleValue2") ^^ {
  26. case "doubleValue1" => _.doubleValue1
  27. case "doubleValue2" => _.doubleValue2
  28. }
  29. }
  30. val dataRecord = DataRecord(100, 75 )
  31. val input = "doubleValue1 / 10 * 2 + doubleValue2"
  32. println(ArithParser.parseAll(ArithParser.arithmicExpr, input).get(dataRecord)) // prints 95
  33.  
  34. }
Success #stdin #stdout 0.4s 382144KB
stdin
Standard input is empty
stdout
95.0