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、、等等,最后在它们之上编写我的解析器failure。item
现在我想知道是否可以在不线性化输入树的情况下制作一个解析器。是否可以 ?
很好的问题。这绝对是可能的,而且我一直在寻找一种可以做到这一点的工具。
我认为关键是你的树的结构将反映在你的原始组合器中。例如,原始item解析器与容器类型相关联[],并提供通过首先/休息来顺序遍历列表的能力。 return并且failure不依赖于[]容器类型,因此不必更改它们来支持树解析。
您需要将其替换为一个或多个允许您遍历树的组合器。我猜你会想要一个组合器让你在兄弟节点(即同一父节点的子节点,在相同的深度)之间移动,并需要第二个组合器让你更深入地进入树。
我不确定的是您是否需要重复的组合器来对应捕获排序、交替、前瞻等模式。必须将其中每一个都实施两次可能会变得非常令人讨厌。