是否可以使用ANTLR解析大文件?

Suz*_*ioc 8 grammar parsing antlr antlr4

是否有可能指示ANTLR不将整个文件加载到内存中?它可以逐个应用规则并按顺序生成最顶层的节点列表以及读取文件吗?也可能以某种方式丢弃分析的节点?

Sam*_*ell 13

是的,你可以使用:

  • UnbufferedCharStream 为你的角色流(传递给词法分析器)
  • UnbufferedTokenStream 您的令牌流(传递给解析器)
    • 此令牌流实现不区分令牌通道,因此请确保在词法分析器规则中使用->skip而不是->channel(HIDDEN)作为不应发送到解析器的命令.
  • 确保调用setBuildParseTree(false)解析器,或者为整个文件创建一个巨大的解析树.

使用其他一些评论进行编辑:

  • 我把相当多的工作纳入确保UnbufferedCharStreamUnbufferedTokenStream最"理智"的方式可能操作,特别是在涉及到mark,release,seek,和getText方法.我的目标是在不损害流释放未使用内存的能力的情况下尽可能多地保留这些方法的功能.
  • ANTLR 4允许真正无限的前瞻.如果您的语法需要预测到EOF做出决定,那么您将无法避免将整个输入加载到内存中.在编写语法时,你必须非常小心地避免这种情况.