假设我需要一个解析器来处理树状输入(例如scala.xml.Elem
)而不是字符串。我想使用this article中的解析器组合器。如果我线性化输入树,我可以轻松地编写这样的解析器。
type Parser[A] = seq: Seq[Elem] => List[(A,Seq[Elem])]
我可以添加解析器 return
,failure
,item
等,最后将解析器写在它们之上。
现在我想知道我是否可以在没有线性化输入树的情况下创建解析器。可能吗 ?
答案 0 :(得分:2)
好问题。绝对有可能做到这一点,而且我一直在寻找能够做到这一点的工具。
我认为关键是树的结构将反映在原始组合器中。例如,原始item
解析器与[]
容器类型绑定,并提供通过先/休息顺序向下遍历列表的能力。 return
和failure
不依赖于[]
容器类型,因此不必更改它们以支持树解析。
您需要将其替换为一个或多个允许您遍历树的组合器。我猜你想要一个组合器让你在兄弟姐妹之间移动(即同一父节点的孩子,在相同的深度)和第二个组合子,让你更深入到树中。
我不确定的是,您是否需要重复的组合器来捕获排序,交替,前瞻等模式。必须两次实施这两者才会变得非常讨厌。