Я впервые использую комбинаторы парсера scala. У меня есть такая ситуация, когда у меня есть список «типов», и они могут расширять другие типы или нет. Если они это сделают, я просто создам карту между типом и его родительским типом. Если нет, я просто сопоставляю тип с «объектом». (Типы — это просто имена строк)
Они пишутся так:
type1 type2 type3 - parentType
or
type0a type0b
в этом случае они будут неявно - object
Я попытался реализовать его следующим образом, но он не компилируется. Он говорит, что ему требуется Option[~List[String, String] и он нашел ~[a,b]. Это также говорит о том, что он не может найти имена значений в первом для понимания, когда на самом деле это указано в совпадении шаблона case. Немного запутался сейчас, что на самом деле происходит.
def type_list = ((name+) ~ ("-" ~> parent_type)?) ^^ {
case names ~ parent_type => for (name <- names) yield name -> parent_type
case names => for (name <- names) yield name -> "object"
}
def name = """[a-zA-Z\d]+""".r
На самом деле я просто хочу, чтобы это возвращало Map[String, String]
, если parent_type
отсутствует, по умолчанию должно быть «объект». Как лучше к этому подойти?