Как обрабатывать возврат различных параметров класса case в синтаксическом анализаторе синтаксического анализатора в Scala - PullRequest
0 голосов
/ 06 октября 2018

Итак, у меня есть производство 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.сделанный.

Какие еще есть варианты?ЛЮБАЯ ПОМОЩЬ ЦЕНА

...