首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在goto中实现goto

在goto中实现goto
EN

Stack Overflow用户
提问于 2011-12-27 07:58:49
回答 3查看 1.5K关注 0票数 9

背景:作为寒假期间的一个短期项目,我正在尝试使用Python和PLY实现一种名为Axe (用于绘制计算器的图形)的编程语言。注意:该语言只允许全局变量,并大量使用指针。

我正在尝试用这种语言实现goto,但不知道如何实现.

我的一般方法是首先使用PLY将代码解析为ast,然后在执行过程中遍历它。

例如,语句

代码语言:javascript
复制
If 3
    Disp 4
    Disp 6
End

...would变成..。

代码语言:javascript
复制
['PROGRAM', 
  ['BLOCK', 
    ['IF', 
      ['CONDITION', 3], 
      ['BLOCK', 
        ['DISP', 4], 
        ['DISP', 6]
      ]
    ]
  ]
]

...which我将递归地执行(我为可读性添加了缩进)。

因为ast是一棵树,所以我不知道如何在不同的节点之间跳。我可能考虑过将树转换为平面数组['IF', ['CONDITION', 3], ['DISP', 4], ['DISP', 6]],这样我就可以使用平面ish数组的索引到代码中的特定行,但这似乎缺乏一定的优雅,几乎感觉像是倒退了一步(尽管我可能错了)。

我看过this,但无法理解它是如何工作的。

任何帮助或暗示都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-27 08:40:42

“递归执行”不适合goto。要使goto工作,您需要一台PC、一个“程序计数器”,程序中的每个语句都必须有一个不同的地址。在执行时,每个语句的地址都分配给PC。当遇到goto时,goto的目标地址(它的参数)被放入PC中,然后从那里恢复执行。

用一种基于堆栈的递归方法几乎是不可能实现的.你有两个选择:

  • 将AST压缩成一个序列,您可以在其中为每个语句分配一个不同的地址--
  • --向您的解释器添加一个“跳过”模式。当遇到goto时,抛出一个GotoException,该GotoException从所有堆栈框架中分离出来,并返回到根目录。Process语句(跳过它们而不执行),直到您到达目标地址.

我认为您可以想象goto的这种实现不是很好的表现,而且可能很难实现。

票数 9
EN

Stack Overflow用户

发布于 2011-12-27 17:49:18

我考虑过把树转换成平面数组.但这似乎缺乏一定的优雅,几乎感觉像是倒退(尽管我可能错了)。

你错了。机器代码总是扁平的。像C这样的语言被扁平化来创建机器代码。

计算器(像其他简单的机器一样)是扁平的。

然而。平平您的斧头语法树不是完全必要的。

您只需将编程源标签应用于树中的每个节点。

然后,一个"GOTO“简单地在树中搜索该标签,并在该标签上继续执行。

票数 3
EN

Stack Overflow用户

发布于 2015-03-27 09:47:41

您还可以将AST压平为有向图(控制流图)。如何这样做以生成可由解释器遍历的networkx图的示例可以找到in the Python package promela。请注意,为此您必须编写一些AST类。

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

https://stackoverflow.com/questions/8642355

复制
相关文章

相似问题

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