2016-07-13 2 views
0

я наткнулся на этот кусок кода разбора строки, как 5 * 5 + 5анализатор ^^^ Scala следуют функции

def add_expr: Parser[Expr] = 
    mult_expr * (
     "+" ^^^ { (a: Expr, b: Expr) => Plus(a, b) } | 
     "-" ^^^ { (a: Expr, b: Expr) => Minus(a, b) }) 

Согласно документу, ^^^ говорит «, если левый операнд разбирает успешно, проигнорируйте результат и используйте значение справа ". Тогда почему этот кусок кода работает? Значение справа от ^^^ является функцией, а не значением Expr.

ответ

1

Я был введен в заблуждение от IDEA. «*» Сразу после mult_expr не def * = rep (this) , но def * [U>: T] (sep: => Parser [(U, U) => U]) = chainl1 (это, sep)

Действительно "+" ^^^ {(a: Expr, b: Expr) => Плюс (a, b)} генерирует синтаксический анализатор, чей тип - Parser [(Expr, Expr) => Expr]. Затем этот анализатор используется в foldLeft для генерации значения Expr