gpt4 book ai didi

java - ANTLR4 java解析器可以处理非常大的文件还是可以流式传输文件

转载 作者:行者123 更新时间:2023-12-04 02:51:57 25 4
gpt4 key购买 nike

ANTLR 生成的 java 解析器是否能够流式传输任意大的文件?

我尝试使用 UnbufferedCharStream 构建 Lexer 并将其传递给解析器。由于在 UnbufferedCharStream 上调用了 size,我得到了一个 UnsupportedOperationException,并且该异常包含一个解释,即您不能在 UnbufferedCharStream 上调用 size。

    new Lexer(new UnbufferedCharStream( new CharArrayReader("".toCharArray())));
CommonTokenStream stream = new CommonTokenStream(lexer);
Parser parser = new Parser(stream);

我基本上有一个使用 pig 从 hadoop 导出的文件。它有大量由'\n'分隔的行。每列由“\t”分隔。这在 java 中很容易解析,因为我使用缓冲读取器读取每一行。然后我按 '\t' 拆分以获得每一列。但我也想进行某种模式验证。第一列应该是格式正确的日期,然后是一些价格列,然后是一些十六进制列。

当我查看生成的解析器代码时,我可以这样调用它

    parser.lines().line()

这会给我一个列表,在概念上我可以对其进行迭代。但是当我得到它时,该列表似乎已经固定大小。这意味着解析器可能已经解析了整个文件。

是否还有 API 的另一部分可以让您流式传输非常大的文件?就像使用 Visitor 或 Listener 在读取文件时被调用的某种方式?但它不能将整个文件保存在内存中。它不适合。

最佳答案

你可以这样做:

InputStream is = new FileInputStream(inputFile);//input file is the path to your input file
ANTLRInputStream input = new ANTLRInputStream(is);
GeneratedLexer lex = new GeneratedLexer(input);
lex.setTokenFactory(new CommonTokenFactory(true));
TokenStream tokens = new UnbufferedTokenStream<CommonToken>(lex);
GeneratedParser parser = new GeneratedParser(tokens);
parser.setBuildParseTree(false);//!!
parser.top_level_rule();

如果文件很大,就不用考虑监听器或访问者了——我会直接在语法中创建对象。只需将它们全部放在某种结构中(即 HashMap、Vector...)并根据需要检索。这样就避免了创建解析树(这确实需要大量内存)。

关于java - ANTLR4 java解析器可以处理非常大的文件还是可以流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17500291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com