2014-10-08 5 views
0

Я довольно новыми для Скале, и я хочу, чтобы разобрать список тематических классов:список Разбор конкретных классов

abstract class D 
case class D0(a: Int, b: Int) extends D 
case class D2(c: String, d: Int) extends D 
case class D3(e: Int, f: String) extends D 
case class D4(e: String, f: String, g: Int) extends D 

Я хочу, чтобы разобрать экземпляр List [D]. Существует в списке специальный заказ, который можно объяснить BNF-подобная нотация:

rep(D0 -> D4 -> rep(D2 -> opt(rep(d3)))) 

D0 следует D4 следует 1-н D2, каждый из D2 затем 1-н D3 и т.д. ...

Я хочу, чтобы создать список типа:

type T0 = (D0, D4, List[(D2, List[D3])]) 

Все решения, которые я нашел до сих пор уродливы и statefull. Как опытный разработчик scala реализует это?

Спасибо

+0

Что вы разбираете из? I.e., каков ваш формат ввода? – sjrd

+1

«Список [D]» - это не то же самое, что и предлагаемая вами структура. Список - это список. Ваша структура - это нечто другое. – Daenyth

+0

Список [D] импортируется из базы данных, основанной на файлах, с разными типами записей, реализующими иерархическую модель базы данных. – Volker

ответ

4

Это не выглядит слишком некрасиво мне (предполагая, что я правильно понял вопрос, это не обычно называют синтаксический):

type T1 = (D2, List[D3]) 

// MatchError if the list doesn't look the way you expected 
def matchList(l: List[D]): List[T0] = l match { 
    case (d0: D0) :: (d4: D4) :: tail => 
    val (d2d3s, tail1) = matchD2D3s(tail) 
    (d0, d4, d2d3s) :: matchList(tail1) 
    case Nil => Nil 
} 

def matchD2D3s(l: List[D]): (List[T1], List[D]) = l match { 
    case (d2: D2) :: tail => 
    val (d3s, tail1) = tail.span(_.isInstanceOf[D3]) 
    val (otherD2D3s, tail2) = matchD2D3s(tail1) 
    ((d2, d3s) :: otherD2D3s, tail2) 
    case l => (Nil, l) // no d2s 
} 
+0

Мне все еще нужно проверить представленное решение, возможно, в этом специальном случае. В новом специальном случае Scala это выглядит не очень легко, особенно если количество случаев будет увеличено. – Volker

Смежные вопросы