对于setBuildParseTree=false的引用,有什么好的例子吗



我正在为一个简单的CSV解析器使用antlr。我想在29gig文件上使用它,但在ANTLRInputStream调用时内存不足

    CharStream cs = new ANTLRInputStream(new BufferedInputStream(input,8192));
    CSVLexer lexer = new CSVLexer(cs);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    CSVParser parser = new CSVParser(tokens);
    ParseTree tree = parser.file();
    ParseTreeWalker walker = new ParseTreeWalker();
    walker.walk(myListener, tree);

我试图将其更改为无缓冲流

    CharStream cs= new UnbufferedCharStream(input)
    CSVLexer lexer = new CSVLexer(cs);
    lexer.setTokenFactory(new CommonTokenFactory(true));
    TokenStream tokens = new UnbufferedTokenStream(lexer);
    CSVParser parser = new CSVParser(tokens);

当我运行walk.walk()函数时,它不处理任何记录。如果我尝试类似的东西

    parser.setBuildParseTree(false);
    parser.addParseListener(myListener);

它也失败了。如果我不构建解析树,我似乎必须以不同的方式解析文件,所以我想要文档或如何做到这一点的示例。

如果我不使用未缓冲的字符流,但我使用了未缓冲的令牌流,则会出现错误:未缓冲的流无法知道其大小。我尝试了不同的排列,但通常会出现java堆错误或"超出GC开销限制"。

我使用的是这个csv语法

我已经在这里回答了一个类似的问题:https://stackoverflow.com/a/26120662/4094678

如果我不构建解析树,所以我想要如何做的文档或示例这

在ant lr book中查找语法操作,如链接答案中所述,忘记监听器和访问者并构建解析树。即使这还不够,也可以将文件拆分为多个较小的文件,然后解析每个文件。
当然,正如评论中提到的那样,增加了javavm内存。

相关内容

  • 没有找到相关文章

最新更新