2016-07-13 19 views
0

ich auf diesem Stück Code kam Reihe von Parsen wie 5 * 5 + 5scala Parser ^^^ gefolgt von einer Funktion

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

Laut Dokument, ^^^ sagt „, wenn der linke Operand erfolgreich analysiert, Ignoriere das Ergebnis und verwende den Wert von rechts ". Warum funktioniert dieses Stück Code? Der Wert von rechts von ^^^ ist eine Funktion, kein Expr-Wert.

Antwort

1

Ich wurde von IDEA in die Irre geführt. Das "*" direkt nach mult_expr ist nicht def * = rep (dies) aber def * [U>: T] (sep: => Parser [(U, U) => U]) = chainl1 (diese sep)

Tatsächlich "+" ^^^ {(a: Ausdruck, b: Ausdruck) => Plus (a, b)} erzeugt einen Parser, dessen Typ Parser [(Ausdruck, Ausdruck) => Ausdruck] ist. Dann wird dieser Parser in foldLeft verwendet, um den Expr-Wert

zu erzeugen