Итак, у меня есть производство CFG:
tipe : "double"
| "float"
| "int"
| "fn" "(" ((tipe ",")* tipe)? ")" ("->" tipe)?
, поэтому он в основном создает такие грамматики, как fn(int)
или fn(float) -> int
или fn(int, double....) -> double
Я пытаюсь создать для него парсери пока у меня есть следующее:
lazy val tipe : PackratParser[Type] =
"int" ^^^ Int() |
"float" ^^^ Float() |
"double" ^^^ Double() |
Проблема, с которой я столкнулся, связана с последним производством.Класс case для него выглядит так:
case class Fnctn(argTypes : Vector[Type], ret : Type)
Таким образом, он принимает Вектор типов и сам Тип.Вектор относится к ((tipe ",")* tipe)?
и ret
- ("->" tipe)?
в CFG.
При отсутствии -> tipe
значение по умолчанию должно быть Int()
.
Итак, в моей реализации синтаксического анализатора я добавил
("fn" ~> "(" ~> repsep(tipe, ",") <~ ")") ~ ("->" ~> tipe) ^^ {
case x ~ None => Fnctn(x, Int())
case x ~ t => Fnctn(x, t)
}
Я подумал, что если он существует, он ставит правильный, а не то, по умолчанию Int()
.Но это дало мне ошибку, сказав found: None, required: Type
Итак, я попытался использовать
... opt("->" ~> tipe)
case x ~ None => Fnctn(x, Int())
case x ~ Some(Int()) => Fnctn(x, Int())
case x ~ Some(Double()) => Fnctn(x, Double())
case x ~ Some(Float()) => Fnctn(x, float())
Но тогда это просто дало мне библиотечные ошибки, нечитаемый mumbo jumbo bc.сделанный.
Какие еще есть варианты?ЛЮБАЯ ПОМОЩЬ ЦЕНА