将父类对象强制转换为子类的问题

Issue With Casting Parent Class Object as Child

本文关键字:子类 问题 转换 父类 对象      更新时间:2023-10-16

我目前正在实现玩具语言"Micro"的编译器,并创建了一些类来处理AST。我使用的解析器工具是Bison。我正试图为while循环和if/else语句生成程序集,但在将父类对象ASTNode强制转换为其子对象WhileNode时遇到了问题。

在我的解析器中,我已经将所有这些节点的返回类型声明为父类ASTNode。

%type <node> if_stmt stmt base_stmt loop_stmt read_stmt write_stmt control_stmt return_stmt assign_stmt else_part while_stmt func_decl
%union{
std::string* s;
std::list<std::string> * str_list;
ASTNode * node;
std::list<ASTNode*> * ast_list;
JumpType * jtype;
Conditional * condition;
}

在while_stmt规则中,我初始化WhileNode,而不包含它所包含的stmt_list。这样我就可以准确地存储currentBlockID,用于生成标签、分支语句等。

while_stmt      : _WHILE _OPAREN cond _CPAREN decl 
{ 
currentBlockID = scope_iterator;
SymbolTable* tmp = new SymbolTable("BLOCK " + std::to_string(scope_iterator++), ststack.top());
ststack.top()->children.push_back(tmp);
ststack.push(tmp);
$<node>$ = new WhileNode($3->left_expr, $3->right_expr, currentBlockID, $3->jtype, ASTNodeType::WHILE);
} 
stmt_list _ENDWHILE  
{  
ststack.pop(); 
dynamic_cast<WhileNode *> $<node>6->copyStmtList(*7);
$$ = $<node>6;
}
;

我已经在中间规则中定义了WhileNode,这样我就可以在其他节点构造中迭代这个blockID之前捕获currentBlockID(if/else节点也会增加blockID。(我的问题是规则末尾的dynamic_cast。我试过用静态和动态演员阵容来做这件事,但两者都有问题。

这是我目前在动态播放时遇到的错误:

src/parser.yy: In function ‘int yyparse()’:
src/parser.yy:388:81: error: invalid type argument of unary ‘*’ (have ‘int’)
dynamic_cast<WhileNode *> $<node>6->copyStmtList(*7);

我已经提到了以这种方式实现它的问题,但仍然存在问题:如何将父类强制转换为子类。

我使用dynamic_cast的原因是,由于返回类型是ASTNode,所以它没有子方法copyStmtList((。如果您能帮助改进这种铸造方法,我们将不胜感激!

好吧,我是个傻瓜。我没有意识到我不小心从'*$7'中省略了'$',在这种情况下,试图用*7做任何事情都只是取消引用int类型(这显然是无效的(。我为这个错误道歉。