我创建了一个Scala的解析器组合过滤基于我到前面问题的答案数据记录如何分析与斯卡拉过滤citeria一个字符串,并用它来过滤对象
我想从答案添加计算器解析器组合这个问题与Scala的解析器组合运算符优先级 ,以我创建基于第一个问题解析器组合的底部。 因此,计算器解析器组合需要接受一个dataRecord使得象“(doubleValue1 / 10)* 2 + doubleValue2”的表达可以被解析以其随后可以采取dataRecord的功能。
这是我想出了,但加,减,时间和分解析器组合正在打破,因为在+ - * /运营商双的成员,而不是功能DataRecord =>双。 如何解决这些解析器组合,使得像一个表达式“(doubleValue1 / 10)* 2 + doubleValue2”可以成功地在可采取的dataRecord功能解析和结果吗?
import scala.util.parsing.combinator._
import scala.util.parsing.combinator.JavaTokenParsers
object Main extends Arith with App {
val dataRecord = new DataRecord(100, 75 )
val input = "( doubleValue1 / 10 ) * 2 + doubleValue2"
println(parseAll(arithmicExpr, input).get(dataRecord)) // prints 95
}
class DataRecord( val doubleValue1 : Double, val doubleValue2 : Double )
class Arith extends JavaTokenParsers {
type D = Double
type Extractor[Double] = DataRecord => Double
//arithmic expression
def arithmicExpr: Parser[Extractor[D]] = term ~ rep(plus | minus) ^^ {case a~b => (a /: b)((acc,f) => f(acc))}
def plus: Parser[Extractor[D]=>Extractor[D]] = "+" ~ term ^^ {case "+"~b => _ + b}
def minus: Parser[Extractor[D]=>Extractor[D]] = "-" ~ term ^^ {case "-"~b => _ - b}
def term: Parser[Extractor[D]] = factor ~ rep(times | divide) ^^ {case a~b => (a /: b)((acc,f) => f(acc))}
def times: Parser[Extractor[D]=>Extractor[D]] = "*" ~ factor ^^ {case "*"~b => _ * (b) }
def divide: Parser[Extractor[D]=>Extractor[D]] = "/" ~ factor ^^ {case "/"~b => _ / b}
def factor: Parser[Extractor[D]] = fpn | "(" ~> arithmicExpr <~ ")" | 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
}
}