是否有任何好的例子来引用setBuildParseTree = false?

时间:2016-04-13 15:12:22

标签: java out-of-memory antlr antlr4

我使用antlr进行简单的CSV解析器。我想在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);

当我运行walker.walk()函数时,它不会处理任何记录。如果我尝试像

那样的话
    parser.setBuildParseTree(false);
    parser.addParseListener(myListener);

它也失败了。如果我不构建一个解析树,似乎我必须以不同的方式解析文件,所以我想要文档或如何执行此操作的示例。

如果我没有使用无缓冲的char流但是我确实使用了无缓冲的令牌流,则会出错:无缓冲的流不能知道它的大小。我尝试了不同的排列,但通常会出现java堆错误或超过" GC开销限制"。

我正在使用this csv grammar

1 个答案:

答案 0 :(得分:1)

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

  

如果我不构建文件,似乎我必须以不同方式解析文件   解析树,所以我想文档或如何做的例子   此

在antlr书中查找语法操作 - 就像在链接的答案中所说的那样,忘记了听众和访客,并构建了一个解析树。即使这还不够,也可以将文件分成许多较小的文件,然后解析每个文件。
当然正如评论中提到的那样增加了java vm内存。