Я думаю, что это должны быть деревья, это правильная структура для списков, вложенных в произвольную глубину.
sealed trait Tree[A]
case class Leaf[A](value: A) extends Tree[A] {
override def toString: String = value.toString
}
case class Node[A](items: List[Tree[A]]) extends Tree[A] {
override def toString: String = "Node(" + items.mkString(", ") + ")"
}
(Делайте toString как вам нравится, но я думаю, что заданный по умолчанию список слишком многословен)
Затем, с небольшими исправлениями в вашей грамматике (+ метод синтаксического анализа, просто для простого тестирования на REPL)
object PrologListParser extends JavaTokenParsers{
def list:Parser[Tree[String]] = "[" ~> listArgs <~ "]"
def listArgs:Parser[Tree[String]] = repsep(list | args, ",") ^^ {Node(_)}
def args:Parser[Tree[String]] = """([^,\[\]])*""".r ^^ {Leaf(_)}
def parse(s: String): ParseResult[Tree[String]] = parse(list, s)
}
PrologListParser.parse("[a, b, [c, [d, e], f, [g], h], [i, j], k]")
res0: PrologList.ParseResult [Tree [String]] = [1.42] проанализировано: Узел (a, b, Узел (c, Узел (d, e), f, Узел (g), h), Узел (i, j), k)