2015-12-22 173 views
1

我在web 中嘗試了很多例子,但找不到任何工作示例。如何使用ANTLRInputStream如何使用ANTLRInputStream從文件讀取輸入?

所以文件 讀取輸入,我可以很容易地理解

所以,請提供一個工作的例子。

在此先感謝。

+0

你可以發表你試過的東西,並解釋出了什麼問題嗎? –

+0

嗯當然。對於那個很抱歉。 語法Exp; /*這將是我們解析器的入口點。 */ eval :additionExp ; additionExp :multiplyExp ( '+' multiplyExp | ' - ' multiplyExp )* ; /*乘法和除法有更高的優先級。 */ multiplyExp :atomExp ('*'atomExp |'/'atomExp )* ; atomExp :Number | '('additionExp')' ; Number :('0'..'9')+('。'('0'..'9')+)? ; WS :(」'| '\噸' | '\ r' | '\ n')/ * {$ =通道HIDDEN;} */ ; –

+0

請看看這個: http://stackoverflow.com/questions/34414352/taking-input-from-file-with-antlr –

回答

3

實際上,將標準FileInputStream傳遞給ANTLRInputStream並不複雜。

從可以看出,ANTLRInputStrean是什麼它將接受相當寬鬆的文件,所以如果你有傳遞一個字符串或字符[]數組,那麼我懷疑有麻煩的是更大的問題:

ANTLRInputStream() 
ANTLRInputStream(char[] data, int numberOfActualCharsInArray) 
This is the preferred constructor for strings as no data is copied 
ANTLRInputStream(InputStream input) 
ANTLRInputStream(InputStream input, int initialSize) 
ANTLRInputStream(InputStream input, int initialSize, int readChunkSize) 
ANTLRInputStream(Reader r) 
ANTLRInputStream(Reader r, int initialSize) 
ANTLRInputStream(Reader r, int initialSize, int readChunkSize) 
ANTLRInputStream(String input) 
Copy data in string to a local char array 

你問例如所以這裏是例子:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import org.antlr.v4.runtime.ANTLRInputStream; 
import org.antlr.v4.runtime.CommonTokenStream; 
import org.antlr.v4.runtime.tree.ParseTree; 
import org.antlr.v4.runtime.tree.ParseTreeWalker; 

// You're going to need to implement these based on the grammar you've created 
import your.package.here.MyLangListener; 
import your.package.here.MyLangTranslator; 

// These are generated by ANTLR 
import your.package.here.parser.LangLexer; 
import your.package.here.LangParser; 


public class App { 
    public static void main(String[] args) { 
     String fileName = "someInputBasedOnYourGrammarRules.lang"; 
     File file = new File(fileName); 
     FileInputStream fis = null; 

     try { 
      // Open the input file stream 
      fis = new FileInputStream(file); 

      // Create a CharStream that reads from standard input 
      ANTLRInputStream input = new ANTLRInputStream(fis); 

      // Create a lexer that feeds off of input CharStream 
      LangLexer lexer = new LangLexer(input); 

      // Create a buffer of tokens pulled from the lexer 
      CommonTokenStream tokens = new CommonTokenStream(lexer); 

      // Create a parser that feeds off the tokens buffer 
      LangParser parser = new LangParser(tokens); 

      // Begin parsing at rule prog 
      ParseTree tree = parser.prog(); 

      // Close the input file 
      fis.close(); 

      // Create a generic parse tree walker that can trigger callbacks 
      ParseTreeWalker walker = new ParseTreeWalker(); 
      // Walk the tree created during the parse, trigger callbacks 
      walker.walk(new MyLangListener(), tree); 
      System.out.println(); // print a \n after translation 

      // Walk the tree again to translate to java 
      walker.walk(new MyLangTranslator(), tree); 

      // Print LISP-style tree 
      //System.out.println(tree.toStringTree(parser)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

另外,我建議你使用ANTLR Maven插件。

+0

謝謝您的回答。 //你需要根據你創建的文法實現這些 import your.package.here.MyLangListener; import your.package.here.MyLangTranslator; 爲什麼你使用這兩個庫。因爲我們沒有在字符串輸入中使用它們,所以效果很好。 請看看我們的代碼:http://stackoverflow.com/questions/34414352/taking-input-from-file-with-antlr 雖然錯誤得到解決。 那麼Maven插件呢?我們真的需要使用它嗎? –

+0

使用插件並不重要,但它可能很有用,因爲它處理依賴關係和組織。MyLangListener和MyLangTranslator是由ANTLR生成的基類的擴展,並被用來覆蓋它們的默認行爲(實際上沒有默認行爲,只是沒有body的方法存根)。對於每個生產規則,生成了兩種方法,一種是進入和退出方法。例如:void enterExpr(@NotNull LangParser.ExprContext ctx);和void exitExpr(@NotNull LangParser.ExprContext ctx); – lucidMonkey