编写解释器——为break语句确定循环目标

C++ Writing an Interpreter - determining loops target for break statement c++

本文关键字:循环 目标 语句 break 解释器      更新时间:2023-10-16

我正在用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语句的部分中,然后检查从开始位置到当前位置是否有中断,如果有,则将目标设置为当前位置。

真的很乱,但是现在可以了