【发布时间】:2014-09-09 21:40:41
【问题描述】:
上下文:我需要为抽象语法树编写一些树匹配规则。
我想要一种简洁的方式,例如,如果为数组访问提供了数字-文字索引(而不是符号),则进行匹配。
假设我有一个抽象类(即具有纯虚函数)lvalue。
lvalue 仅是 2 个具体类的子类,variable 和 array_element。
为了以不同的方式处理这两种情况,我可以应用访问者模式(但我认为这里有点矫枉过正)或使用丑陋的 dynamic_cast 混乱。 (我已经使用访问者模式来遍历我的 AST 和 CFG)
void main() {
lvalue *lv = new variable("foo");
// ... somehow do a tree-pattern matching on lv
}
要检查 lv 是否是带有文字(即常量)索引的数组访问,我当然可以编写以下内容:
if (array_element *ae = dynamic_cast<array_element*>(lv)) {
if (dynamic_cast<constant*>(ae->index)) {
cout << "Yes, lv is an array-access and indexed by a literal" << endl;
}
}
...但这该死的丑陋且无法维护。下面是朝着正确方向迈出的一步(如果它有效的话):
void func(variable *n) {
cout << "got a variable" << endl;
}
void func(array_element *n) {
cout << "got a array" << endl;
}
有什么办法可以避免dynamic_cast的混乱吗?
请指教:)
【问题讨论】:
-
你可能想看看 LLVM 做了什么。它需要一些管道,它仍然是一种解决方法,但生成的匹配代码可能是你得到的最干净的代码(没有严重滥用预处理器)。
标签: c++ polymorphism pattern-matching abstract-syntax-tree