如何使用 ANTLRInputStream 从文件中读取输入?

Avi*_*ner 3 java antlr antlr4

我在网络上尝试了很多示例,但找不到任何有效的示例。

因此,请提供一个如何使用 ANTLRInputStream 从文件中读取输入的工作示例

这样我就可以很容易地理解。

提前致谢。

luc*_*key 5

它实际上并不比将标准 FileInputStream 传递给 ANTLRInputStream 更复杂。

从文档中您可以看到 ANTLRInputStrean 对于它所接受的内容相当自由,因此,如果您在传递 String 或 char[] 数组时遇到问题,那么我怀疑存在更大的问题:

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
Run Code Online (Sandbox Code Playgroud)

你要求举例,所以这里是例子:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,我建议您使用 ANTLR Maven 插件。