编写解释器——为break语句确定循环目标
C++ Writing an Interpreter - determining loops target for break statement c++
我正在用c++编写一个简单的程序解释器。当我在构建程序的内部表示时,我得到了一个break语句,我如何确定包含循环的目标位置?
void Imp::whilestmt()
{
Expr *pExpr;
accept(Token::WHILE);
expr(pExpr);
WhileStmt *pwhilestmt = new WhileStmt(pExpr,vm.getLocationCounter);
vm.add(pwhilestmt);
accept(Token::LOOP);
stmtlist();
pwhilestmt->setTarget(vm.getLocationCounter);
accept(Token::END);
accept(Token::LOOP);
vm.add(new EndLoopStmt);
}
我的break语句对象将把while语句的目标作为参数,我如何确定这一点?
我会考虑构建一种执行树/管道。每个LOOP/WHILE都将是一个新的分支(类似于每个函数),所以当您遇到END/BREAK指令时,您只需返回到分支的原点并继续执行。
我认为解决方案是添加一个前向引用,该引用在生成该级别循环的所有代码时(通过查找循环结束的位置)被解决。
换句话说,当生成循环代码时,您需要形成一个"跳转"指令,该指令将其目标设置为您还不知道它在哪里的地方。解决方案是有一个未知目的地的跳跃(将"目的地"设置为指令0或-1或0xdeaddead或其他可以轻松识别的东西,以便以后进行调试-因为避免出现"我没有正确修复它"的错误的最佳方法是使其易于识别这些地方- bug只发生在难以识别的地方,就像当你带伞时从不下雨)。在生成整个循环之前,保持一个此类跳转的修复列表,然后按照您的方式处理该修复列表,并填写您现在知道的"这里"的相关地址(循环后的下一个指令)。我怀疑对于循环本身的条件,你也需要类似的东西——如果它为假,那么你需要在循环之后继续。
我添加了setTarget作为Stmt的虚函数。
我将开始位置存储在处理if语句的部分中,然后检查从开始位置到当前位置是否有中断,如果有,则将目标设置为当前位置。
真的很乱,但是现在可以了
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 目标C++,如何在后台线程中使用运行循环?
- 如何以编程方式循环访问所有 CMake 目标
- 使用STD :: TIE作为循环目标的范围
- 编写解释器——为break语句确定循环目标