Формат вывода на жасмин с ANTLR в Java

int addr = gen_address();
              $code.addr = addr;
              $code.append(
                  ldc(44),
                  istore(addr),
                  "getstatic java/lang/System/out Ljava/io/PrintStream;",
                iload(addr),
                "invokevirtual java/io/PrintStream/print(I)V");
int addr = gen_address();
              $code.addr = addr;
              $code.append(
                  ldc(22),
                  istore(addr),
                  "getstatic java/lang/System/out Ljava/io/PrintStream;",
                iload(addr),
                "invokevirtual java/io/PrintStream/print(I)V");

Эта грамматика выведет число 44 а также 22
Но вывод будет выглядеть так (4422)

Я хочу добавить пробел между числами, чтобы результат был ( 44 22)

Я думаю, что-то должно быть изменено в

            "invokevirtual java/io/PrintStream/print(I)V");

1 ответ

Его нелегко понять: ваш код выглядит как код действия ANTLR, верно? Ваш компилятор генерирует файл jasmin (Java-ассемблер), верно? И вы позже выполните этот файл, и вы ожидаете увидеть (44 22)?

Поэтому, если вы изучите код жасмина, вы обнаружите, что никогда не печатали пробел.

Один вариант: изменить invokevirtual java/io/PrintStream/print(I)V в invokevirtual java/io/PrintStream/print(Ljava/lang/String)V; Тем не менее, вам придется подготовить аргументы для этого шага, 22 - это целое число, и вы должны преобразовать его в " 22", что является большим количеством кода жасмина.

Лучший вариант (с моей точки зрения): вставить invokevirtual java/io/PrintStream/print(C)V между двумя утверждениями. Вы должны нажать ' ' (пробел) в стеке, прежде чем вызывать.

Другие вопросы по тегам