编译并在mac终端上运行java程序

时间:2014-01-16 19:13:36

标签: java eclipse macos compiler-construction terminal

我编写了一个编译程序,现在我正试图从终端运行它。我在我的程序中使用antlr库。使用eclipse编译时,此代码非常有效。

我在终端

中使用以下命令
javac -classpath antlr-runtime-3.2.jar Main.java

文件antlr-runtime-3.2.jar存在,但我仍然收到以下错误

  • Main.java:34:错误:找不到符号MiniJavaLexer lexer = new MiniJavaLexer(charStream)
  • Main.java:42:错误:找不到符号PrintVisitor dfsPrint = new PrintVisitor()
  • Main.java:46:错误:找不到符号SymbolTableVisitor stVisitor = new SymbolTableVisitor()

我正在使用的每个班级都会出现此错误。

我想编译然后使用终端

运行程序

main.java文件包含

package mini.java.compiler;

import java.io.IOException;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.tree.Tree;

public class Main {

    public static void main(String[] args) throws RecognitionException,
            IOException {
        // TODO Auto-generated method stub
        String file = "samples/factorial.java";

        CharStream charStream = new ANTLRFileStream(file);
        MiniJavaLexer lexer = new MiniJavaLexer(charStream);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        MiniJavaParser parser = new MiniJavaParser(tokens);
        MiniJavaParser.goal_return res = parser.goal();

        Tree tree = (Tree) res.getTree(); // The root node.

        /* Print tree */
        PrintVisitor dfsPrint = new PrintVisitor();
        dfsPrint.visit(tree);

        /* Symbol table construction */
        SymbolTableVisitor stVisitor = new SymbolTableVisitor();
        SymbolTable symTab = (SymbolTable) stVisitor.visit(tree);
        System.out.println("-------------------");
        System.out.println("Symbol Table");
        System.out.println("-------------------");
        symTab.printTable();
        symTab.resetTable();

        /* Type checking */
        TypeCheckingVisitor tcVisitor = new TypeCheckingVisitor(symTab);
        tcVisitor.visit(tree);
        symTab.resetTable();

        /* Byte Code Generation */
        CodeGenerationVisitor cgVisitor = new CodeGenerationVisitor(symTab);
        ClassFile cf = (ClassFile) cgVisitor.visit(tree);
        System.out.println("-------------------");
        System.out.println("Stack Machine Code");
        System.out.println("-------------------");
        cf.print();
        cf.writeToFile();
    }
}

1 个答案:

答案 0 :(得分:1)

看起来MiniJavaLexer和MiniJavaParser不在您的类路径上。只要确保他们这样做并尝试再次编译。

看起来它们是在同一个包中声明的,因为没有导入 - 这就是为什么你能够在eclipse中运行它。

说,这些类已经编译好并且在Main.java附近尝试运行javac -classpath .:antlr-runtime-3.2.jar Main.java - (使用;分隔Windows上的路径和:在Unix上)

如果您只有源代码,则需要将其编译为。

他们可能不会使用ANTLR的一个原因是,如果您使用语法文件来声明词法分析器和解析器,那么首先必须生成这些类。