gpt4 book ai didi

python - 在 ast 中实现 goto

转载 作者:太空狗 更新时间:2023-10-29 22:27:39 25 4
gpt4 key购买 nike

背景:作为寒假期间的一个简短项目,我正在尝试使用 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 正常工作,您需要一台 PC、一个“程序计数器”,并且程序中的每个语句都必须有一个不同的地址。在执行时,每个语句的地址都分配给 PC。当遇到 goto 时,goto 的目标地址(它的参数)被放入 PC 并从那里恢复执行。

这几乎不可能通过基于堆栈的递归方法实现。您有两个选择:

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

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

我认为您可以想象 goto 的这种实现不是非常高效并且可能难以实现。

关于python - 在 ast 中实现 goto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8642355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com