如何在基于野牛的解释器中实现分支?
How to implement branching in bison-based interpreter?
现在我开发一个虚拟机。字节码解释器使用 flex 和 bison。
下面是一些代码,例如:
some:
add r0 4 4
jmp some
我的问题是:如何处理jmp指令?
我可以让野牛回到一个标签,继续分析吗?
我开发的是字节码解释器,不是编译器...
不,你不能让野牛回去。您通常使用 Bison 来解析代码并生成某种中间表示。像 AST 或字节码。然后你在一个单独的步骤中执行它。
因此在您的情况下,由于您正在为字节码格式解析汇编语言,因此将其转换为实际的字节码是有意义的。那就是当您的解析器看到 "add r0 4 4" 时,它应该做的就是将相应的字节序列附加到包含您的字节码的数组中。然后在解析器创建这个数组后,你可以将它传递给一个真正执行字节码的函数。
将这两个步骤分成两个单独的程序可能也很有意义:一个将源文件转换为二进制字节码文件的汇编器,以及一个读取字节码文件并执行它的字节码解释器。后者根本不需要使用 Bison,只需要读取字节和 switch
就可以了。
现在我开发一个虚拟机。字节码解释器使用 flex 和 bison。 下面是一些代码,例如:
some:
add r0 4 4
jmp some
我的问题是:如何处理jmp指令? 我可以让野牛回到一个标签,继续分析吗?
我开发的是字节码解释器,不是编译器...
不,你不能让野牛回去。您通常使用 Bison 来解析代码并生成某种中间表示。像 AST 或字节码。然后你在一个单独的步骤中执行它。
因此在您的情况下,由于您正在为字节码格式解析汇编语言,因此将其转换为实际的字节码是有意义的。那就是当您的解析器看到 "add r0 4 4" 时,它应该做的就是将相应的字节序列附加到包含您的字节码的数组中。然后在解析器创建这个数组后,你可以将它传递给一个真正执行字节码的函数。
将这两个步骤分成两个单独的程序可能也很有意义:一个将源文件转换为二进制字节码文件的汇编器,以及一个读取字节码文件并执行它的字节码解释器。后者根本不需要使用 Bison,只需要读取字节和 switch
就可以了。