将父类对象强制转换为子类的问题
Issue With Casting Parent Class Object as Child
我目前正在实现玩具语言"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类型(这显然是无效的(。我为这个错误道歉。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 子类化 std::thread:构造器中可变参数模板函数的问题
- 模板子类的重载运算符== 的问题
- 指向子类对象的指针的静态数组出现问题
- 创建 QQuickItem 子类的实例是否有问题,我不打算渲染或添加到 QML 树中的实例?
- 我构造子类对象的方式有什么问题?
- C++中包含父类对象的子类有什么问题(如果有的话)
- 我可以显示根据需要创建的对象(QLabel 的子类)吗?(我遇到的问题是删除它)
- C++:在父类中创建子类时出现问题
- 子类到基类的转换问题
- c++继承问题,基类指针不能指向子类
- 向下转换到子类的问题,多态不能工作
- 奇怪的是,反复出现依赖模板和模板参数的子类化问题
- 我尝试对 CButton 进行子类化有什么问题?
- 实例化子类的多态性问题
- C++ 父类和子类中的文件 I/O 问题