用于树而不是字符串的解析器组合器

时间:2014-08-25 15:52:20

标签: xml scala parsing functional-programming

假设我需要一个解析器来处理树状输入(例如scala.xml.Elem)而不是字符串。我想使用this article中的解析器组合器。如果我线性化输入树,我可以轻松地编写这样的解析器。

type Parser[A] = seq: Seq[Elem] => List[(A,Seq[Elem])] 

我可以添加解析器 returnfailureitem等,最后将解析器写在它们之上。

现在我想知道我是否可以在没有线性化输入树的情况下创建解析器。可能吗 ?

1 个答案:

答案 0 :(得分:2)

好问题。绝对有可能做到这一点,而且我一直在寻找能够做到这一点的工具。

我认为关键是树的结构将反映在原始组合器中。例如,原始item解析器与[]容器类型绑定,并提供通过先/休息顺序向下遍历列表的能力。 returnfailure不依赖于[]容器类型,因此不必更改它们以支持树解析。

您需要将其替换为一个或多个允许您遍历树的组合器。我猜你想要一个组合器让你在兄弟姐妹之间移动(即同一父节点的孩子,在相同的深度)和第二个组合子,让你更深入到树中。

我不确定的是,您是否需要重复的组合器来捕获排序,交替,前瞻等模式。必须两次实施这两者才会变得非常讨厌。