0

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

4

0 に答える 0