2016-09-23 4 views
0

Sagen, ich habe einen Parser wie folgt aus:Scala Parser Combinator: Parsen eine Option

trait PT {} 

trait StatementPT extends PT{} 

... 

class LoopConditionPT(val operation: String, val variable: IdentPT, val condition: Option[(String,ExpressionPT)]) extends StatementPT { ... } 

Der Option[(String,ExpressionPT)]) Bug mich für einen Tag, ich meine ich mit Option[T] umgehen kann, aber Option[(T,T)]? Ich schrieb dieses def loopCondition aber es stellt sich immer Fehler:

def loopCondition: Parser[LoopConditionPT] = "some string" ~ var ~ opt(("TIL"|"WILE") ~ expression) ^^ { 
    case a ~ b ~ Some(c ~ d) => new LoopCondition(a, b, Option[(c, d)]) 
    case a ~ b ~ None => new LoopCondition(a, b, Option[("None", -1)]) 

Kann mir jemand helfen das loopCondition behebt? Vielen Dank.

+2

Das ist keine gültige Syntax ... Statt 'Option [(c, d)] 'write' Option (c -> d) ',' Option ((c, d)) ',' Einige (c -> d) ', etc ... –

Antwort

0

[] werden für Typen verwendet. Wenn Sie eine Option erstellen möchten - z. B. Option.apply() -, verwenden Sie Klammern anstelle von eckigen Klammern. Anstatt also

new LoopCondition(a, b, Option[(c, d)]) 

sagen

new LoopCondition(a, b, Option((c, d))) 

oder können Sie syntaktischen Zucker für Tupeln verwenden und sagen

new LoopCondition(a, b, Option(c -> d))