Xml 树而不是字符串的解析器组合符
假设我需要一个解析器来处理类似树的输入(例如,Xml 树而不是字符串的解析器组合符,xml,scala,parsing,functional-programming,Xml,Scala,Parsing,Functional Programming,假设我需要一个解析器来处理类似树的输入(例如,scala.xml.Elem),而不是字符串。我想使用来自的解析器组合器。如果我将输入树线性化,我可以很容易地编写这样的解析器 type Parser[A] = seq: Seq[Elem] => List[(A,Seq[Elem])] 我可以添加解析器return,failure,item,等等,最后在它们上面编写我的解析器 现在我想知道我是否可以在不线性化输入树的情况下创建一个解析器。可能吗 好问题。这是绝对有可能做到的,我一直在寻找一
scala.xml.Elem
),而不是字符串。我想使用来自的解析器组合器。如果我将输入树线性化,我可以很容易地编写这样的解析器
type Parser[A] = seq: Seq[Elem] => List[(A,Seq[Elem])]
我可以添加解析器return
,failure
,item
,等等,最后在它们上面编写我的解析器
现在我想知道我是否可以在不线性化输入树的情况下创建一个解析器。可能吗 好问题。这是绝对有可能做到的,我一直在寻找一个工具,这样做了一段时间 我认为关键是你的树的结构将反映在你的原始组合子中。例如,原语
项
解析器绑定到[]
容器类型,并提供通过先/后遍历列表的能力<代码>返回和失败
不依赖于[]
容器类型,因此不必更改它们以支持树解析
您需要将其替换为一个或多个允许您遍历树的组合器。我猜您可能需要一个组合器来允许您在兄弟节点之间移动(即相同父节点的子节点,在相同深度),另一个组合器允许您深入到树中
我不确定的是,您是否需要重复的组合器来对应于捕获排序、交替、前瞻等模式。必须两次实现其中的每一个可能会非常令人讨厌。您能分享一下为什么要避免对输入树进行线性化吗?始终可以创建树结构的线性视图。此外,解析通常用于将线性结构转换为树!。。。对于树结构中尚未出现的解析,您希望从中得到什么?@RexKerr我想检查XML结构:例如,假设我有一些函数,用于检查输入是否是具有特定标签的元素。现在我想编写这些函数来检查输入元素是否
@RexKerr线性化是否正常。我只是在检查备选方案。如果您搜索“树匹配”而不是解析,您可能会更幸运。在谷歌上快速搜索“树匹配”发现了不少论文和文章。不过,我不知道有多少树匹配与模式匹配相关。这可能是特殊情况吗?@IonuțG.Stan,谢谢。我将搜索“树匹配”。我不知道它和模式匹配有什么关系。谢谢!两个组合词--nextbro
移动到下一个兄弟姐妹和oldson
移动到“最年长”的孩子--正是我想到的。@Michael!我希望很快能有时间实施这一计划;如果是这样,我会相应地更新。:)也许我也会这样做。在斯卡拉。