У меня есть производство 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..
работает, но мне просто любопытно