2015-12-22 175 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