我遇到了解析字符串的代码,如5 * 5 + 5
def add_expr: Parser[Expr] =
mult_expr * (
"+" ^^^ { (a: Expr, b: Expr) => Plus(a, b) } |
"-" ^^^ { (a: Expr, b: Expr) => Minus(a, b) } )
根据文档,^^^表示"如果左操作数成功解析,则忽略结果并使用右边的值"。那么为什么这段代码有效呢? ^^^右边的值是一个函数,而不是Expr值。
答案 0 :(得分:1)
我被IDEA误导了。 " *"就在mult_expr之后没有 def * = rep(this) 但 def * [U>:T](sep:=> Parser [(U,U)=> U])= chainl1(this,sep)
确实" +" ^^^ {(a:Expr,b:Expr)=> Plus(a,b)}生成一个解析器,其类型为Parser [(Expr,Expr)=> EXPR。然后在foldLeft中使用此解析器生成Expr值