【发布时间】:2011-06-16 12:01:00
【问题描述】:
我有一组 S 的“小”树 S[i] 我需要在更大的树中找到它们的位置 它们用作模式以在更大的树T。在我开始构造 T(这是一个解析树)之前,我知道 S,所以我正在考虑使用 cutting-plane 方法 来匹配节点(因为解析器生成CST)。
S 中的树与 T 的 AST 不同 - 考虑一下 XPath 与 XML - S 包含 XPath 的树表示,而 T 是源代码的实际 AST -我需要i 和T 的匹配节点向量之间的映射。
但是我不确定我将使用的算法的名称。
基本上我知道我想做什么,感觉就像一个“divide et impera for trees”,在我复制的 LALR 解析器的每一个转变中,我都有一个堆栈来保存可能的候选匹配堆栈的顶部并从S[i] 中消除候选人i,这无论如何都不会匹配,并且在减少之后我从堆栈中弹出。一开始S的所有成员都是可能的候选人。
请注意:这只是关于 AST,ASG 是另一回事......
附录
这是一个解析树T。
解析函数将知道我称之为“树路径”的列表,以规范的形式,也表示为树,存储在S 中。但它们看起来不像分析树,它们有自己的语言来表示,类似于 XPath。
获取所有返回值为变量的函数的树路径示例:
function[body[return[expr[@type="variable"]]]]]
- 那么我应该在现有文献中寻找什么?
- 还有其他建议吗?
- 是否已经有可以像这样查询元注释树的语言?一个开源的 C(不是 C++)库是理想的。
【问题讨论】:
-
这听起来像tiling,有时用于编译器中的指令选择。标准编译器书籍应该涵盖它。但是,如果您有
S[i]子树和T子树的特定示例以及预期的输出,则可能更容易给您一个好的答案。更新:实际上它听起来也像很多其他 PL 技术:模式匹配和函数式语言中的类型推断/统一。或者 Prolog 子句选择....很多 PL 工作是树匹配。 -
请看我的编辑。 XPath -> XML 类比应该更清楚。
-
我会画点东西,任何阅读此内容的人:不要急于回答,书签:D
-
完成,看图,会提示重新阅读整个问题,其中有一些重要的编辑。
标签: algorithm parsing programming-languages compiler-theory