我正在编写一个编译器作为作业,并且我在 dynamic_cast 方面遇到了一些关键问题。我将尝试分享无法工作的关键代码片段,以及人们可能需要了解这里发生了什么的基本代码。
相关类:
#define YYSTYPE Node*
class Node {
public:
Node(){}
virtual ~Node() {}
};
class Type : public Node {
private:
// some vars
public:
Type(/* some vars */) {}
// more methods
}
以及我的 .ypp 文件中的一些规则:
M: /* epsilon */ { // Marker, generates new llvm label
genLabel();
$$ = new Type(/*...*/);
}
S: RETURN SC {/* unrelated code */}
| WHILE LPAREN M E {/* unrelated code */} RPAREN M S {
Type* m1 = dynamic_cast<Type*>($3);
if(!m1){
cout << "m1 bad" << endl;
}
Type* m2 = dynamic_cast<Type*>($6);
if(!m2){
cout << "m2 bad" << endl;
}
// more unrelated code
}
注意:与其他规则没有冲突。野牛确保了这一点。
解析一些输入时的输出,例如:
输入:
while (true) return;
输出:
m2 bad
我想不通。一个动态转换如何正常工作(基于额外的代码,并返回正确的指针),而另一个应该做同样的事情却失败了。