2015-04-10 2 views
0
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)Формат выходной жасмин с ANTLR в Java

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

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

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

ответ

0

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

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

Один вариант: изменения 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 между двумя утверждениями. Перед вызовом вам нужно нажать '' (пробел) в стеке.

Смежные вопросы