Я разрабатываю язык, который был реализован в Java с помощью ANTLR 4 и его шаблона посетителя. Теперь то, что я хотел бы сделать, это из реализованного кода в шаблоне посетителя сгенерировать байт-код JVM, который впоследствии можно будет выполнить на виртуальной машине Java.
Так, например, с учетом следующего кода (давайте скажем, это язык, который я создаю):
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, который обрабатывает различные инструкции моего языка (назначение, если, логическое и реляционное сравнение , et c):
// ...
void ifStatement(...) {
// ...
}
// &&, ||, !
void logicalComparison(...) {
// ...
}
// ==, !=, <=, >=, <, >
void relationalComparison(...) {
// ...
}
//...
Проблема, с которой я сталкиваюсь, заключается в том, что когда я генерирую код для оператора if
, мне нужен способ запомнить положение сравнений, чтобы я мог вернитесь после генерации оператора else
, чтобы разместить его положение так, чтобы переход был возможен, если условия не выполняются.
Каков наилучший способ go о генерации байт-кода?