Я новичок в Scala, работаю над S99, пытаясь изучить Scala. Одна из проблем связана с преобразованием строки в древовидную структуру данных. Я могу сделать это «вручную», я также хочу посмотреть, как это сделать, используя библиотеку комбинатора парсеров Scala.
Структура данных для дерева
sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
override def toString = "."
}
object Node {
def apply[T](value: T): Node[T] = Node(value, End, End)
}
И вход должен быть строкой, например: a(b(d,e),c(,f(g,)))
Я могу разобрать строку, используя что-то вроде
trait Tree extends JavaTokenParsers{
def leaf: Parser[Any] = ident
def child: Parser[Any] = node | leaf | ""
def node: Parser[Any] = ident~"("~child~","~child~")" | leaf
}
Но как я могу использовать библиотеку синтаксического анализа для построения дерева? Я знаю, что могу использовать ^^
для преобразования, например, некоторой строки в целое число. Меня смущает необходимость «знать» левое и правое поддеревья при создании экземпляра Node
. Как я могу это сделать, или это признак того, что я хочу сделать что-то другое?
Не лучше ли мне взять то, что возвращает синтаксический анализатор ((((((a~()~(((((b~()~d)~,)~e)~)))~,)~(((((c~()~)~,)~(((((f~()~g)~,)~)~)))~)))~))
для приведенного выше примера ввода), и построить дерево на его основе, чем использовать операторы синтаксического анализатора, такие как ^^
или ^^^
, для непосредственного построения дерева?