【发布时间】:2012-12-27 23:25:13
【问题描述】:
我是 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)~,)~)~)))~)))~)) 用于上面的示例输入),并基于它构建树,而不是使用像 ^^ 或 ^^^ 这样的解析器运算符直接构建树?
【问题讨论】:
标签: parsing scala tree parser-combinators