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

3

我在网上尝试了很多例子,但没有找到任何可行的例子。

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

这样我就可以轻松理解了。

提前致谢。


你能否发布一下你尝试过的内容,并解释一下出了什么问题? - Bart Kiers
没问题。对此感到抱歉。语法 Exp;/* 这将是我们解析器的入口点。 */ eval : additionExp ;additionExp : multiplyExp ( '+' multiplyExp | '-' multiplyExp )* ;/* 乘法和除法具有更高的优先级。 / multiplyExp : atomExp ( '' atomExp | '/' atomExp )* ;atomExp : Number | '(' additionExp ')' ;Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;WS
: (' ' | '\t' | '\r'| '\n') /{$channel=HIDDEN;}/ ;
- Avid Learner
请看一下这个链接: http://stackoverflow.com/questions/34414352/taking-input-from-file-with-antlr - Avid Learner
2个回答

5

这并不比将标准的FileInputStream传递给ANTLRInputStream更复杂。

从文档中可以看出,ANTLRInputStrean对其接受的内容非常宽容,因此如果您在传递字符串或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插件。


感谢您的回答。// 您需要根据您创建的语法来实现这些内容 import your.package.here.MyLangListener; import your.package.here.MyLangTranslator;为什么要使用这两个库。因为我们在字符串输入中没有使用它们,而且它们运行良好。 请查看我们的代码:http://stackoverflow.com/questions/34414352/taking-input-from-file-with-antlr 虽然错误已经解决了。那么Maven插件呢?我们真的需要使用它吗? - Avid Learner
使用该插件并非必须,但是它可能很有用,因为它可以处理依赖关系和组织。MyLangListener 和 MyLangTranslator 是由 ANTLR 生成的基类扩展,并用于重写其默认行为(实际上没有默认行为,只有带有空体的方法存根)。对于每个生产规则,都会生成两种方法:进入方法和退出方法。例如:void enterExpr(@NotNull LangParser.ExprContext ctx); 和 void exitExpr(@NotNull LangParser.ExprContext ctx); - lucidMonkey

3
从Antlr 4.7开始,您可以使用CharStreams:
YourLexer lexer = new YourLexer(CharStreams.fromFileName("path/to/file.lang"));

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接