Его первый раз, используя комбинаторы парсера scala. У меня такая ситуация, когда у меня есть список «типов», и они могут распространять другие типы или нет. Если это так, я просто создаю карту между типом и его родительским типом. Если нет, просто сопоставьте тип с «объектом». (Типы просто струнные имена)Комбинировщик Parser Дополнительные детали
Они написаны так:
type1 type2 type3 - parentType
или
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
отсутствует он должен по умолчанию «объект». Как лучше подойти к этому?
Спасибо ... Эти монады до сих пор удается поставить меня из колеи. Спасибо за простую версию. – jbx