Java - 从 ANTLR 4 访问者实现生成 JVM 字节码

标签 java jvm antlr4 bytecode visitor-pattern

我正在开发一种语言,该语言已在 ANTLR 4 及其访问者模式的帮助下用 Java 实现。现在我想做的是从访问者模式中实现的代码中生成稍后可以在 Java 虚拟机上执行的 JVM 字节码。

例如,给出以下代码(假设这是我正在创建的语言):

int a = 1;
int b = 2;
int c = 3;
int d = 4;
if (a == b && c == d && a == d) {
    System.out.println("b = c");
} else {
    System.out.println("No!");
}

我在 ANTLR 4 的访问者模式中实现了以下功能,它处理我的语言的不同指令(赋值、if、逻辑和关系比较等):

// ...
void ifStatement(...) {
    // ...
}
// &&, ||, !
void logicalComparison(...) {
    // ...
}
// ==, !=, <=, >=, <, >
void relationalComparison(...) {
    // ...
}
//...

我遇到的问题是,当我为 if 语句生成代码时,我需要一种方法来记住比较的位置,以便我可以在生成 else 后返回 语句,放置其位置,以便在不满足条件时可以跳转。

生成字节码的最佳方法是什么?

最佳答案

您可以将标签与 goto 字节码一起使用。根据您使用的代码生成工具,它可能是这样的

// Visit your condition so its result is pushed on the stack

// Create three new labels
int iflab   = ++labels; // Label to jump to if the condition was true
int elselab = ++labels; // Label to jump to if the condition was false
int donelab = ++labels; // Label to jump to once done executing either branches

generate("ifne label" + iflab);
generate("goto label" + elselab);

generate("label" + iflab + ":");
// visit the statement needing to be executed if the condition was true
generate("goto label" + donelab);

generate("label" + elselab + ":");
// visit the statement needing to be executed if the condition was false (if there is one)
generate("goto label" + donelab);

println("label" + donelab + ":");
// You are done with this statement, keep visiting the following statements.

这尚未优化(创建了太多标签并转到),但应该很清楚。生成方法只是将字节码写入文件,我使用 Jasmin写这个的时候。使用 ASM 应该类似或任何其他 JVM 字节码工具。

关于Java - 从 ANTLR 4 访问者实现生成 JVM 字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60983673/

相关文章:

java - python cli 中的 java BCryptPasswordEncoder() 等效于什么?

java - 使用 Java JNA 和 SendInput() 发送键盘输入

java - 尝试将我的 GWT 项目拆分为多个模块 - "did you forget to inherit a required module?"

networking - 关于 Hadoop 网络系统调用

Antlr4:输入不匹配

java - 如何使用 ant 为现有项目生成 javadoc?

java - 解释可能的堆外泄漏的 jemaloc 数据

java - 内存不足错误 : Java heap space error when start solr

java - 如何为 ANTLR 中的模糊输入生成多个解析树

java - 在 ANTLR 版本 4 中构建 AST