如何预见和避免"code too large"?

How to anticipate and avoid "code too large"?

我正在使用 Antlr 3.5 编写 SQL 语法(由于公司政策,我无法分享)。

我只提供我需要解析的语句,但语法又大又复杂。

我 运行 遇到 "code too large" 生成的 java 文件超过 65535 字节的问题 - 有时在静态初始化程序中,有时在某些方法中。

根据各个地方的建议,我将语法拆分为多个语法,并通过 import 关键字使用它们。

这种方法目前运行良好,但我必须继续添加到这个语法中 而且我相信在某些时候它会再次 运行 进入这段代码太大的问题。
另外,我也不知道拆分语法到底有多少收获。

我的问题是:

  1. 我们怎么知道我们再次接近代码太大问题?
  2. 有没有一种方法可以让我们准确测量出多少 improvement/gain 我们通过拆分语法来获得。
  3. 生成的文件仍然很大 - SqlParserParser.java 为 1.77MB 并且 SqlParser_SqlSubParser.java 是 1.36MB。
    文件大小是否表明存在此问题?
  4. 除了语法拆分,还有什么可以做的吗

几点:

  1. 我现在无法切换到 Antlr4。
  2. 请尽量不要因为缺少示例而对我的问题投反对票,因为我无法 post 真正的语法和一个小示例不会重现我的问题。

据我所知,问题不在于 class 大小本身,而是方法大小。对我们来说,问题是静态初始化器(对编译器来说,它也是一种方法!)——它初始化所有的后续集和 DFA。

我们最终将 SQL 语法拆分为多个语法文件(某些 SQL 方言甚至有 6 个文件),并直接修改了部分 ANTLR(Java.stg 模板) 将大型方法和静态初始值设定项拆分为较小的方法。