我有一组S
的“小”树S[i]
我需要在更大的 中找到它们的位置,这些 用作查找的模式在较大的树T
中匹配子树。在我开始构建S
(这是一个解析树)之前我知道T
,所以我正在考虑使用切割平面方法来匹配节点(当解析器生成CST时。
S
中的树与T
的AST不同 - 考虑XPath与XML - S
保存XPath的树表示,而T
是源代码的实际AST - 我需要i
和T
匹配节点向量之间的映射。
但是我不确定我会使用的算法的名称。
基本上我知道自己想要做什么,感觉就像是一个“除了et impra for trees”,它有一个堆栈,我可以在那里找到匹配的候选者,在LALR解析器的每个班次我复制堆栈的顶部并从i
中消除候选S[i]
,无论如何都不会匹配,并且在减少之后我从堆栈中弹出。起初,S
的所有成员都是可能的候选人。
请注意:这只是AST,ASG是另一个故事......
附录
这是一个解析树T
。
解析函数将以{(1}}中存储的规范形式(也表示为树)知道我称之为“树路径”的列表。但它们看起来不像parsetree,它们有自己的语言可供表示,类似于XPath。
获取所有具有返回值的函数的树路径示例:
S
答案 0 :(得分:3)
1)你的S树作为XPath对应于一些T树。为什么不提前构建T树,然后模式匹配呢?
2)如果你想将一个模式与一个结构相匹配,你可以想象将模式编译成某种状态机,当给定的树被匹配时,它会转换。如果状态机进入接受状态,则表示您找到了匹配项。如果您有多个模式,则每个模式都可以作为状态机处理,您可以“并行”运行它们(通过模拟)。为了提高效率,请计算所有状态机的交叉产品;现在只有一个,每个输入只发生一次转换。这个想法我称之为“模式产品”,你会看到类似于各种高效匹配器的东西。一个接近你想要做的就是Rete Algorithm,它会跟踪哪些“模式”在其输入的数据发生变化时是实时的。
答案 1 :(得分:0)
可能值得研究JXPath:http://commons.apache.org/jxpath/ 我不确定你的目标语言是什么,但它可能值得一试。
无论如何,如果我不得不尝试实现这样的东西,我的第一个冲动就是找到一种方法来“序列化”两棵树,并将问题简化为简单的字符串匹配之一。