【问题标题】:Implementing goto in an ast在 ast 中实现 goto
【发布时间】:2011-12-27 07:58:49
【问题描述】:

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

我正在尝试用这种语言实现 goto,但不知道该怎么做。

我的一般方法是先使用 PLY 将代码解析成 ast,然后边走边执行。

例如语句

If 3
    Disp 4
    Disp 6
End

...会变成...

['PROGRAM', 
  ['BLOCK', 
    ['IF', 
      ['CONDITION', 3], 
      ['BLOCK', 
        ['DISP', 4], 
        ['DISP', 6]
      ]
    ]
  ]
]

...我将递归执行(为了便于阅读,我添加了缩进)。

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

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

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

【问题讨论】:

  • “跳”?你认为你所说的“跳跃”是什么意思?为什么要在节点之间“跳转”?请提供一个具体示例,您将“跳转”到任意节点。很难找到对基于树的语言进行跳转的合理需求。
  • 我选择实现的语言中有 goto 语句。我想匹配规范,这就是我需要 goto 的原因。我制作了这个基于树的内容,因为这在当时似乎是一件明智的事情。我猜这是个错误:还有哪些其他形式的语言?
  • AXE 真的需要 GOTO 吗?似乎很奇怪。有无数种“形式”的语言:过程语言、函数语言等等。在过程语言中,Python 和 Java(以及其他语言)没有 GOTO。这是一件非常罕见的事情。
  • AST 擅长编译,而不擅长评估。除了goto 还有其他问题 - 循环。你想如何在没有某种程序计数器的情况下实现循环?
  • 这是一种低级语言。另外,我之前使用“while”循环实现了循环。

标签: python interpreter goto abstract-syntax-tree ply


【解决方案1】:

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

使用基于堆栈的递归方法几乎不可能实现这一点。你有两个选择:

  • 将您的 AST 扁平化为一个序列,您可以在其中为每个语句分配一个不同的地址

  • 为您的解释器添加“跳过”模式。当遇到goto 时,抛出一个GotoException,它会跳出所有堆栈帧并返回到根。处理语句(跳过它们而不执行)直到到达目标地址。

我想你可以想象goto 的这种实现不是很高效,而且实现起来可能很脆弱。

【讨论】:

  • 好的,感谢您的建议!我想我打算把树弄平。
【解决方案2】:

我考虑过将树转换为扁平数组...但这似乎缺乏某种优雅,几乎感觉像是倒退了一步(尽管我可能错了)。

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

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

但是。扁平化 AX 语法树并非完全必要

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

然后“GOTO”只是在树中搜索该标签并在该标签处恢复执行。

【讨论】:

  • 啊,关于机器代码的要点。我想我当时错了:)
  • 因为机器码是扁平的,我们现在不经常用它来编程。我们更喜欢结构化语言,并使用工具将漂亮的结构化语言扁平化到机器执行的扁平世界中。
【解决方案3】:

您还可以将 AST 展平为有向图(控制流图)。可以在in the Python package promela 中找到如何执行此操作以生成解释器可以遍历的networkx 图形的示例。请注意,您必须为此编写一些 AST 类。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多