Комбинатор синтаксического анализатора Scala: анализ параметра

Скажем, у меня есть такой парсер:

trait PT {}

trait StatementPT extends PT{}

...

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

Option[(String,ExpressionPT)]) беспокоит меня в течение дня, я имею в виду, что я могу справиться с Option[T], но Option[(T,T)]? Я написал это def loopCondition, но оно всегда вызывает ошибку:

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)])

Может ли кто-нибудь помочь мне исправить loopCondition? Спасибо.


person Community    schedule 23.09.2016    source источник
comment
Это недопустимый синтаксис... Вместо Option[(c,d)] напишите Option(c -> d),Option((c,d)),Some(c -> d) и т.д...   -  person gilad hoch    schedule 23.09.2016


Ответы (1)


[] используются для обозначения типов. Если вы хотите создать Option, то есть вызвать Option.apply(), используйте круглые скобки вместо квадратных скобок. Итак, вместо

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

сказать

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

или вы можете использовать синтаксический сахар для кортежей и сказать

new LoopCondition(a, b, Option(c -> d))
person Mehmet Akif Tütüncü    schedule 23.09.2016