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

Итак, я пытаюсь создать парсер, и это одно из правил производства:

app : app "(" ((exp ",")* exp)? ")"

И класс для этого выглядит следующим образом:

 case class AppExp(fn : Expression, args : Vector[Expression])

Главное вотподвела меня это Vector[Expression].Как мне сделать так, чтобы парсер возвращал это?

Я пытался преобразовать производство:

 lazy val app : PackratParser[Expression] =
   app ~ ("(" ~> opt(rep(exp <~ ",") ~> exp) <~ ")") ^^ { case e ~ t => AppExp (e, t) }

Но часть opt делает так, что возвращается Option вместо A Vector.

found:Option[...]
required:Vector[...]
And it points to the `t` in `AppExp(e, t)` in the error message. 

Надеюсь, я объясню все ясно.Что делает Vector, хорошо выражений в этом случае, но в целом?Поскольку в некоторых других классах они также требуют Вектор выражений, я не знаю, что это влечет за собой.Я вообще что-то делаю правильно?Любая помощь приветствуется.Спасибо

1 Ответ

0 голосов
/ 29 сентября 2018

Конструкция opt(rep(exp <~ ",") ~> exp) слишком сложна и отбрасывает все, кроме самого последнего выражения.Вместо этого используйте repsep(exp, ",").

...