Ошибка выполнения файла.classes, сгенерированного Jasmin

У меня есть грамматика Gram.ge Я должен проверить это с Жасмин. Каталог папок содержит:

  • Gram.g
  • CodeGenerator.java
  • Instruction.java
  • Main.java
  • Opcode.java
  • SymbolTable.java
  • Type.java
  • jasmin.jar
  • Библиотечный каталог, который содержит несколько программ (например, A.pas), очень просто написанных в соответствии с моей грамматикой и сохраненных в.pas

В то время как родительская папка (та, что выше) содержит:

  • ANTLR-3,5-complete.jar

Затем из командной строки (Windows) я помещаю в каталог и запускаю следующие команды:

java -cp.;../ antlr-3.5-complete.jar Org.anltr.Tool Gram.g

javac -cp.;../ antlr-3.5-complete.jar *.java

java -cp.;../ antlr-3.5-complete.jar Главная / Библиотека / A.pas> Output.j

java -jar jasmin.jar Output.j

выход Java

Файл CodeGenerator.java: импорт java.util.*;

public class CodeGenerator {

    private Vector<Instruction> instructions = new Vector<Instruction>(); 
    private int counter = 0;

    public Instruction emit(Opcode opCode) {
        Instruction ist = new Instruction(opCode); 
        instructions.add(ist); 
        return ist; 
    }

    public Instruction emit(Opcode opCode, int operand) {
        Instruction ist = new Instruction(opCode, operand);
        instructions.add(ist);
        return ist;
    }

    public void emitLabel(int operand) {
        emit(Opcode.LABEL, operand);
    }

    public int newLabel() {
        return counter++;
    }

    public String toJasmin() {
        String temp = "";
        temp += header; 
        for(Instruction ist : instructions) 
            temp += ist.toJasmin() + "\n";
        temp += footer;
        return temp;
    }

    public String toString() {
        String temp = "";
        for(Instruction ist : instructions)
            temp += ist + "\n";
        return temp;
    }

    private static final String header =
        ".class public Output \n"
        + ".super java/lang/Object \n"
        + "\n"
        + ".method public <init>()V\n"
        + "  aload_0 \n"
        + "  invokenonvirtual java/lang/Object/<init>()V\n"
        + "  return \n"
        + ".end method \n"
        + "\n"
        + ".method public static printBool(I)V\n"
        + "  .limit stack 3\n"
        + "  getstatic java/lang/System/out Ljava/io/PrintStream;\n"
        + "  iload_0 \n"
        + "  bipush 1\n"
        + "  if_icmpeq Ltrue \n"
        + "  ldc \"false\"\n"
        + "  goto Lnext \n"
        + "Ltrue:\n"
        + "  ldc \"true\"\n"
        + "Lnext:\n"
        + "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V\n"
        + "  return \n"
        + ".end method \n"
        + "\n"
        + ".method public static printInt(I)V\n"
        + "  .limit stack 2\n"
        + "  getstatic java/lang/System/out Ljava/io/PrintStream;\n"
        + "  iload_0 \n"
        + "  invokestatic java/lang/Integer/toString(I)Ljava/lang/String;\n"
        + "  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V\n"
        + "  return \n"
        + ".end method \n"
        + "\n"
        + ".method public static run()V\n"
        + "  .limit stack 1024\n"
        + "  .limit locals 256\n";

    private static final String footer =
        "  return \n"
        + ".end method \n"
        + "\n"
        + ".method public static main([Ljava/lang/String;)V\n"
        + "  invokestatic Output/run()V\n"
        + "  return \n"
        + ".end method \n";     

}       

Команды выполняются без каких-либо проблем, кроме последней (выходной Java), которая генерирует эту ошибку:

    Exception in thread "main" java.lang.NoClassDefFoundError:
            at Output.run(Output.j)
            at Output.main(Output.j)
    Caused by: java.lang.ClassNotFoundException:
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            ... 2 more

Файл Output.j:

.class public Output 
.super java/lang/Object 

.method public <init>()V
  aload_0 
  invokenonvirtual java/lang/Object/<init>()V
  return 
.end method 

.method public static printBool(I)V
  .limit stack 3
  getstatic java/lang/System/out Ljava/io/PrintStream;
  iload_0 
  bipush 1
  if_icmpeq Ltrue 
  ldc "false"
  goto Lnext 
Ltrue:
  ldc "true"
Lnext:
  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
  return 
.end method 

.method public static printInt(I)V
  .limit stack 2
  getstatic java/lang/System/out Ljava/io/PrintStream;
  iload_0 
  invokestatic java/lang/Integer/toString(I)Ljava/lang/String;
  invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
  return 
.end method 

.method public static run()V
  .limit stack 1024
  .limit locals 256
  ldc 10
  ldc 20
  ldc 30
  imul
  iadd
  invokestatic printInt(I)V
  return 
.end method 

.method public static main([Ljava/lang/String;)V
  invokestatic Output/run()V
  return 
.end method 

Файл A.pas:

print(10 + 20 * 30)

Где может быть ошибка? Спасибо

1 ответ

Решение

Ваше сообщение об ошибке гласит:

java.lang.ClassNotFoundException:

Но формат этого сообщения обычно выглядит так:

java.lang.ClassNotFoundException: SomeNonExistingClass

Как получается, что имя класса, который не найден, отсутствует? Потому что в вашем примере есть инструкция, которая ссылается на пустое имя класса (""). Поэтому вам нужно искать инструкцию, в которой вы забыли указать имя класса. И вот здесь:

invokestatic printInt(I)V

Вместо этого следует читать:

invokestatic Output/printInt(I)V

это решит вашу проблему.

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