背景:作为寒假期间的一个短期项目,我正在尝试使用Python和PLY实现一种名为Axe (用于绘制计算器的图形)的编程语言。注意:该语言只允许全局变量,并大量使用指针。
我正在尝试用这种语言实现goto,但不知道如何实现.
我的一般方法是首先使用PLY将代码解析为ast,然后在执行过程中遍历它。
例如,语句
If 3
Disp 4
Disp 6
End...would变成..。
['PROGRAM',
['BLOCK',
['IF',
['CONDITION', 3],
['BLOCK',
['DISP', 4],
['DISP', 6]
]
]
]
]...which我将递归地执行(我为可读性添加了缩进)。
因为ast是一棵树,所以我不知道如何在不同的节点之间跳。我可能考虑过将树转换为平面数组['IF', ['CONDITION', 3], ['DISP', 4], ['DISP', 6]],这样我就可以使用平面ish数组的索引到代码中的特定行,但这似乎缺乏一定的优雅,几乎感觉像是倒退了一步(尽管我可能错了)。
我看过this,但无法理解它是如何工作的。
任何帮助或暗示都将不胜感激。
发布于 2011-12-27 08:40:42
“递归执行”不适合goto。要使goto工作,您需要一台PC、一个“程序计数器”,程序中的每个语句都必须有一个不同的地址。在执行时,每个语句的地址都分配给PC。当遇到goto时,goto的目标地址(它的参数)被放入PC中,然后从那里恢复执行。
用一种基于堆栈的递归方法几乎是不可能实现的.你有两个选择:
goto时,抛出一个GotoException,该GotoException从所有堆栈框架中分离出来,并返回到根目录。Process语句(跳过它们而不执行),直到您到达目标地址.我认为您可以想象goto的这种实现不是很好的表现,而且可能很难实现。
发布于 2011-12-27 17:49:18
我考虑过把树转换成平面数组.但这似乎缺乏一定的优雅,几乎感觉像是倒退(尽管我可能错了)。
你错了。机器代码总是扁平的。像C这样的语言被扁平化来创建机器代码。
计算器(像其他简单的机器一样)是扁平的。
然而。平平您的斧头语法树不是完全必要的。
您只需将编程源标签应用于树中的每个节点。
然后,一个"GOTO“简单地在树中搜索该标签,并在该标签上继续执行。
发布于 2015-03-27 09:47:41
您还可以将AST压平为有向图(控制流图)。如何这样做以生成可由解释器遍历的networkx图的示例可以找到in the Python package promela。请注意,为此您必须编写一些AST类。
https://stackoverflow.com/questions/8642355
复制相似问题