Я разрабатываю язык, который был реализован на 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, который обрабатывает различные инструкции моего языка (назначение, если, логическое и реляционное сравнение и т. д.):
// ...
void ifStatement(...) {
// ...
}
// &&, ||, !
void logicalComparison(...) {
// ...
}
// ==, !=, <=, >=, <, >
void relationalComparison(...) {
// ...
}
//...
Проблема, с которой я сталкиваюсь, заключается в том, что когда я генерирую код для оператора if
, мне нужен способ запомнить позицию сравнений, чтобы я мог вернуться после создания оператора else
, чтобы разместить его позицию, чтобы прыжок был возможен если условия не выполняются.
Как лучше всего сгенерировать байт-код?
Label
еще до того, как вы определите их фактическое местоположение с помощьюvisitLabel(…)
. Я не знаю подробностей, но API посетителя парсера должен поддерживать передачу контекстной информации родительской конструкции в подвыражение. Больше не должно быть необходимо. - person Holger   schedule 02.04.2020