2014-01-16 90 views
0

我写了一个编译器程序,现在我试图从终端运行它。我在我的程序中使用antlr库。这个代码在使用eclipse编译时工作得很好。编译并运行在mac终端上的java程序

我在终端使用下面的命令

javac -classpath antlr-runtime-3.2.jar Main.java 

文件ANTLR运行时-3.2.jar存在,但仍然我收到以下错误

  • Main.java:34:错误:无法找到符号MiniJavaLexer词法分析器=新MiniJavaLexer(charStream)
  • Main.java:42:错误:无法找到符号PrintVisitor dfsPrint =新PrintVisitor()
  • Main.java:46:错误:无法找到符号SymbolTableVisitor stVisitor =新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

@DaveNewton我没有导入它们,因为它们在同一个包中。 –

+1

然后你的编译类路径不正确。 –

回答

1

貌似MiniJavaLexer和MiniJavaParser是不是你的类路径上。只要确保他们这样做,并尝试再次编译。

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

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

如果你只对他们的来源,他们需要编译至。

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