我编写了一个编译程序,现在我正试图从终端运行它。我在我的程序中使用antlr库。使用eclipse编译时,此代码非常有效。
我在终端
中使用以下命令javac -classpath antlr-runtime-3.2.jar Main.java
文件antlr-runtime-3.2.jar存在,但我仍然收到以下错误
我正在使用的每个班级都会出现此错误。
我想编译然后使用终端
运行程序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();
}
}
答案 0 :(得分:1)
看起来MiniJavaLexer和MiniJavaParser不在您的类路径上。只要确保他们这样做并尝试再次编译。
看起来它们是在同一个包中声明的,因为没有导入 - 这就是为什么你能够在eclipse中运行它。
说,这些类已经编译好并且在Main.java附近尝试运行javac -classpath .:antlr-runtime-3.2.jar Main.java
- (使用;分隔Windows上的路径和:在Unix上)
如果您只有源代码,则需要将其编译为。
他们可能不会使用ANTLR的一个原因是,如果您使用语法文件来声明词法分析器和解析器,那么首先必须生成这些类。