应该如何在编译器中实现进入内部或“兄弟”作用域?

问题描述

(注意:这是 my question about closures over goto labels 的伴侣。我相信这个问题的答案将有助于解决一个问题。)

在 C 中,goto 语句超越作用域是完全合法的,如 this question 所示:

int cond(void);
void use(int);

void foo() 
{
    {
        int y;
        label:
        y = 2;
        use(y);
    }

    {
        int z = 3;
        use(z);

        /* jump to sibling scope: */ if(cond()) goto label;
    }

    /* jump to inner scope: */ if(cond()) goto label;
}

相比之下,Algol 60 或 Algol 68 以及可能在其他语言中不允许这样的代码。 (阿尔戈勒 60 allows jumps into compound statements,but not into blocks。)

这样的跳转应该如何实现?在我的语言中,进入一个块会创建一个新的堆栈框架;将块激活和过程调用一视同仁是很方便的,因为块也返回一个值,就像 Algol 68 中的闭子句或 Common Lisp 的 progn。因此,传输到块需要为当前层和传输目标之间的任何层级创建帧。另一方面,转移到外部作用域很简单,只需要将堆栈展开到某个级别。 (当然,同一范围内的转移是微不足道的。)

假设我们正在为传统的基于堆栈的虚拟机生成字节码。

这是一个例子:

begin
  integer x,p;
  p := 10;
  x := 20;
  go to label;
  begin
    integer y;
    y := begin
           integer q;
           label:
             q := x + 2;
             p + q;
         end;
  end;
end;

这应该将 p + q(即 32)分配给 x

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...