首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用goto或类似语言的组合语言解释器中实现尝试/除/最后?

如何在使用goto或类似语言的组合语言解释器中实现尝试/除/最后?
EN

Stack Overflow用户
提问于 2016-07-22 22:57:54
回答 1查看 275关注 0票数 3

如何在解释器上实现try/catch/finally功能(目前我正在使用F#)?

我怀疑GOTOs是可以使用的(但是,在解释器中提供它的功能也是必要的,但是我从来没有使用过GOTO (只知道它是邪恶的!)也不知道如何保护环境。

P.D:我已经知道CPS (延续)可以用来模拟异常和任何其他控制流。然而,它使语言实现和请求优化的其余部分变得复杂,从而消除了它的开销,对于这个问题,我希望了解其他方法。

P.D.2:除了CPS之外,还有另一种替代方案,可以很容易地实现自定义控制流?或者一种推广GOTOs的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-23 05:30:19

控件可以通过多种方式避开“尝试”块:

  • Goto在周围块中的标签(注意: goto X和goto Y是两个不同的转义!)
  • 从包含try的函数返回
  • 在尝试中抛出异常
  • 从try主体调用的函数传播异常
  • (可检测到)调用try主体中的exit()

你可能有更多,取决于你的语言。

尝试-最终块必须做的是捕获所有这些,执行最后部分,然后继续预期的操作。

实现这一目标的一种方法是为每个块转义创建一个传输岛。转移岛作为每个这些操作的目标;如果控制到达转移岛K,则块逃逸K已经发生。传输岛所做的是调用一个(无参数的)子例程,其中包含finally子句,然后执行一个动作以继续转义K。

想象一下下面的“尝试-最后”块:

代码语言:javascript
复制
   try
      ...goto X...  // ... means some control structure wrapped around this
      ...raise Z...
      ...call q()... // throws exception
      ...goto Y...
      ...return 5...
   finally
       <some actions>
   end
   ...return <exp>

此代码可编译为:

代码语言:javascript
复制
   // try
      ... goto  TIX...  // TIk ==> "tranfer island k"
      ...exception=Z; goto TIE ...
      ...try call q()
         catch exception; goto TIE
         end try 
      ...result=5; goto TIR...
    // finally
      local subroutine finally()
          { <some actions> }
      TIX: call finally();
           goto X;
      TIY: call finally();
           goto Y;
      TIR: call finally();
           goto RETURN;
      TIE: call finally();
           propagate exception;  // means "pass control to containing exception handler"
      ...
      // end try

           result=<exp>;
      RETURN:
           return result;

在这种背景下,您必须让解释器执行操作,就像存在此代码一样。显然,解释器不需要实例化传输岛;它知道发生了哪种类型的块转义,可以执行最终操作,然后继续执行块转义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38536362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档