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

我想不通。一个动态转换如何正常工作(基于额外的代码,并返回正确的指针),而另一个应该做同样的事情却失败了。

4

0 回答 0