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

Java 如何使用AntlInputStream从文件中读取输入?,java,antlr,antlr4,Java,Antlr,Antlr4,我在网上尝试了很多例子 但是找不到任何有效的例子 因此,请提供一个如何从文件中读取输入的工作示例 使用AntlInputStream 这样我就很容易理解了 提前感谢。这实际上并不比将标准FileInputStream传递给AntlInputStream复杂 从文档中可以看出,AntlInputStrean在接受什么方面非常自由,因此,如果在传入字符串或char[]数组时遇到问题,那么我怀疑存在更大的问题: ANTLRInputStream() ANTLRInputStream(char[] d

我在网上尝试了很多例子 但是找不到任何有效的例子

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

这样我就很容易理解了


提前感谢。

这实际上并不比将标准FileInputStream传递给AntlInputStream复杂

从文档中可以看出,AntlInputStrean在接受什么方面非常自由,因此,如果在传入字符串或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
你问的例子如下:

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插件

在Antlr 4.7中,您可以使用CharStreams:

YourLexer lexer = new YourLexer(CharStreams.fromFileName("path/to/file.lang"));

另外,从4.7版开始,ANTLRFileStream已被弃用。

您能否发布您尝试过的内容并解释出现的问题?是的。很抱歉。语法表达式;/*这将是我们的解析器的入口点eval:additionExp;additionExp:multiplyExp(“+”multiplyExp |“-”multiplyExp);/*乘法和除法的优先级更高multiplyExp:atomExp('atomExp |'/'atomExp)*;atomExp:Number |'('additionExp');编号:('0'..'9')+('0'..'9')+);WS:(“”|’\t’|’\r’|’\n')/*{$channel=HIDDEN;}*/;请看一下:谢谢你的回答您将需要根据您创建的语法来实现这些功能。导入您的.package.here.MyLangListener;导入您的.package.here.MyLangTranslator;你为什么用这两个libs。因为我们没有在字符串输入中使用它们,而且效果很好。请看一下我们的代码:尽管错误已经解决了。那么Maven插件呢?我们真的需要使用它吗?使用插件并不重要,但它可能很有用,因为它处理依赖关系和组织。MyLangListener和MyLangTranslator是ANTLR生成的基类的扩展,用于覆盖它们的默认行为(实际上没有默认行为,只有没有主体的方法存根)。对于每个产生式规则,生成两种方法,一种是进入和退出方法。例如:void enterExpr(@NotNull LangParser.ExprContext ctx);和void exitExpr(@NotNull LangParser.ExprContext ctx);