import scala.
util.
parsing.
combinator.
_ import scala.
util.
parsing.
combinator.
JavaTokenParsers
case class DataRecord
(val doubleValue1
: Double,
val doubleValue2
: Double
)
type Extractor
[Double
] = DataRecord
=> Double
//arithmic expression
def arithmicExpr
: Parser
[Extractor
[D
]] = plus
def plus
: Parser
[Extractor
[D
]] = repsep
(times,
"+") ^^
{ summands
: List
[Extractor
[D
]] => (in : DataRecord) => summands.map((e : Extractor[D]) => e(in)).foldLeft(0d)(_ + _)
}
def times
: Parser
[Extractor
[D
]] = repsep
(division,
"*") ^^
{ factors
: List
[Extractor
[D
]] => (in : DataRecord) => factors.map((e : Extractor[D]) => e(in)).foldLeft(1d)(_ * _)
}
def division
: Parser
[Extractor
[D
]] = rep1sep
(number,
"/") ^^
{divisons
: List
[Extractor
[D
]] => (in : DataRecord) => divisons.map((e : Extractor[D]) => e(in)).reduce(_ / _)
} | number
def number
: Parser
[Extractor
[D
]] = fpn | intExtractor
def fpn
: Parser
[Extractor
[D
]] = floatingPointNumber ^^
(s
=> Function.
const(s.
toDouble)_) def intExtractor
: Parser
[Extractor
[D
]] = ("doubleValue1" |
"doubleValue2") ^^
{ case "doubleValue1" => _.
doubleValue1 case "doubleValue2" => _.
doubleValue2 }
}
val dataRecord
= DataRecord
(100,
75 ) val input
= "doubleValue1 / 10 * 2 + doubleValue2" println(ArithParser.parseAll(ArithParser.arithmicExpr, input).get(dataRecord)) // prints 95
}
aW1wb3J0IHNjYWxhLnV0aWwucGFyc2luZy5jb21iaW5hdG9yLl8KaW1wb3J0IHNjYWxhLnV0aWwucGFyc2luZy5jb21iaW5hdG9yLkphdmFUb2tlblBhcnNlcnMKCm9iamVjdCBNYWluIGV4dGVuZHMgQXBwIHsKICBjYXNlIGNsYXNzIERhdGFSZWNvcmQodmFsIGRvdWJsZVZhbHVlMSA6IERvdWJsZSwgIHZhbCBkb3VibGVWYWx1ZTIgOiBEb3VibGUgKQoKICB0eXBlIEQgPSBEb3VibGUKICB0eXBlIEV4dHJhY3RvcltEb3VibGVdID0gRGF0YVJlY29yZCA9PiBEb3VibGUKCiAgb2JqZWN0IEFyaXRoUGFyc2VyIGV4dGVuZHMgSmF2YVRva2VuUGFyc2VycyB7CiAgICAvL2FyaXRobWljIGV4cHJlc3Npb24KICAgIGRlZiBhcml0aG1pY0V4cHI6ICAgICAgIFBhcnNlcltFeHRyYWN0b3JbRF1dID0gcGx1cwogICAgZGVmIHBsdXM6ICAgICAgICAgICAgICAgUGFyc2VyW0V4dHJhY3RvcltEXV0gPSByZXBzZXAodGltZXMsICIrIikgXl4geyBzdW1tYW5kcyA6IExpc3RbRXh0cmFjdG9yW0RdXSA9PgogICAgICAoaW4gOiBEYXRhUmVjb3JkKSA9PiBzdW1tYW5kcy5tYXAoKGUgOiBFeHRyYWN0b3JbRF0pID0+IGUoaW4pKS5mb2xkTGVmdCgwZCkoXyArIF8pCiAgICB9CiAgICBkZWYgdGltZXM6ICAgICAgICAgICAgICBQYXJzZXJbRXh0cmFjdG9yW0RdXSA9IHJlcHNlcChkaXZpc2lvbiwgIioiKSBeXiB7IGZhY3RvcnMgOiBMaXN0W0V4dHJhY3RvcltEXV0gPT4KICAgICAgKGluIDogRGF0YVJlY29yZCkgPT4gZmFjdG9ycy5tYXAoKGUgOiBFeHRyYWN0b3JbRF0pID0+IGUoaW4pKS5mb2xkTGVmdCgxZCkoXyAqIF8pCiAgICB9CgogICAgZGVmIGRpdmlzaW9uIDogICAgICAgICAgIFBhcnNlcltFeHRyYWN0b3JbRF1dID0gcmVwMXNlcChudW1iZXIsICIvIikgXl4ge2Rpdmlzb25zIDogTGlzdFtFeHRyYWN0b3JbRF1dID0+CiAgICAgIChpbiA6IERhdGFSZWNvcmQpID0+IGRpdmlzb25zLm1hcCgoZSA6IEV4dHJhY3RvcltEXSkgPT4gZShpbikpLnJlZHVjZShfIC8gXykKICAgIH0gfCBudW1iZXIKICAgIGRlZiBudW1iZXIgOiAgICAgICAgICAgIFBhcnNlcltFeHRyYWN0b3JbRF1dID0gZnBuIHwgaW50RXh0cmFjdG9yCiAgICBkZWYgZnBuOiAgICAgICAgICAgICAgICBQYXJzZXJbRXh0cmFjdG9yW0RdXSA9IGZsb2F0aW5nUG9pbnROdW1iZXIgICAgICAgICAgXl4gKHMgPT4gRnVuY3Rpb24uY29uc3Qocy50b0RvdWJsZSlfKQogICAgZGVmIGludEV4dHJhY3RvcjogICAgICAgUGFyc2VyW0V4dHJhY3RvcltEXV0gPSAoImRvdWJsZVZhbHVlMSIgfCAiZG91YmxlVmFsdWUyIikgICAgICAgICAgICAgXl4gewogICAgICBjYXNlICJkb3VibGVWYWx1ZTEiID0+IF8uZG91YmxlVmFsdWUxCiAgICAgIGNhc2UgImRvdWJsZVZhbHVlMiIgPT4gXy5kb3VibGVWYWx1ZTIKICAgIH0KICB9CiAgdmFsIGRhdGFSZWNvcmQgPSBEYXRhUmVjb3JkKDEwMCwgNzUgKQogIHZhbCBpbnB1dCA9ICJkb3VibGVWYWx1ZTEgLyAxMCAqIDIgKyBkb3VibGVWYWx1ZTIiCiAgcHJpbnRsbihBcml0aFBhcnNlci5wYXJzZUFsbChBcml0aFBhcnNlci5hcml0aG1pY0V4cHIsIGlucHV0KS5nZXQoZGF0YVJlY29yZCkpIC8vIHByaW50cyA5NQoKfQ==