如何在基于野牛的解释器中实现分支?

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 就可以了。