【发布时间】: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