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

Mic*_*ael 5 xml parsing functional-programming scala

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

type Parser[A] = seq: Seq[Elem] => List[(A,Seq[Elem])] 
Run Code Online (Sandbox Code Playgroud)

我可以添加解析器 return、、等等,最后在它们之上编写我的解析器failureitem

现在我想知道是否可以在线性化输入树的情况下制作一个解析器。是否可以 ?

Mat*_*ick 3

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

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

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

我不确定的是您是否需要重复的组合器来对应捕获排序、交替、前瞻等模式。必须将其中每一个都实施两次可能会变得非常令人讨厌。