我目前正在用C语言编写一个小解释器,用于执行我创建的一种语言(这种语言与Python非常相似)。我已经编写了词法分析器和语法分析器,并且现在我的程序可以输出AST。我正在尝试将此AST转换为字节码。目前,我的算法遍历AST(深度优先),并可以为简单的算术表达式生成字节码,而现在我正在尝试实现if语句。
由于我的代码量很大,所以我无法在这里复制所有的代码,但是目前该程序接收一个AST,该AST可能看起来像
ADD
|-- 1
|-- MUL
|-- 2
|-- 3
并将其转换为
LOAD 1 //the real code doesn't put the value here, but a number representing the position of this value in an array
LOAD 2
LOAD 3
MUL
ADD
对于简单表达式来说很容易,但是我真的不知道如何为if语句生成字节码。我知道如果比较结果为false,则必须跳转到else从句,并且还必须从每个if / else if块的末尾跳转,但是如果跳转超过256个字节的字节码怎么办?
0
显然是无用的,所以您可以有范围为-128..127(不包括0),并将0视为表示“读取两个字节以获取16位数字”的含义。如果这16位的第一个字节为零,则以这种方式编码毫无意义,因此您可以将其视为标志,表示“读取3或4个字节以获取24或32位数字”(取决于您是否认为24位数字好用),等等。或者,您可以只使用FARJUMP等指令。 - torek