私は課題としてコンパイラを書いていますが、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
私はそれを理解することはできません。1 つの動的キャストが (追加のコードに基づいて) 正常に機能し、正しいポインターを返す方法はありますか?まったく同じことを行うはずの別のキャストは失敗します。