2014-01-16 89 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的一個原因是,如果您使用語法文件來聲明詞法分析器和分析器,並且首先必須生成這些類。