Как создать парсер для необязательных слов в CFG с разными классами падежей - PullRequest
0 голосов
/ 04 октября 2018

У меня есть производство CFG, которое:

let: "let" "var"? idn "=" exp

Так что это позволяет использовать грамматики типа let a = 3 или let var t = 2

У меня также есть 2 класса дел, один с varи один без var

case class Let(name : Idn, exp : Expression) 
case class LetVar(name : Idn, exp : Expression) 

Так что, если существует var, он должен анализироваться с соответствующим классом дел.

Я пытался:

lazy val let : PackratParser[Let] =
("let" ~> idn) ~ ("=" ~> exp) ^^ {case x ~ t => Let(x, t)}
("let" ~> "var" ~> idn ) ~ ("=" ~> exp) ^^ {case x ~ t => LetVar(x, t)}

Это исключает, если грамматика просто let, а не var.Но он не прошел тест var, который я имел, говоря, что ожидал idn, но вместо этого он получил var в позиции var.Я не вижу, что именно идет не так, как все это имеет смысл для меня.

Есть ли исправление для этого, или я единственный вариант создать новый lazy val... для var?Потому что первоначальное тестирование показывает, что создание нового lazy val.. работает, но мне просто любопытно

...