如何预见和避免"code too large"?
How to anticipate and avoid "code too large"?
我正在使用 Antlr 3.5 编写 SQL 语法(由于公司政策,我无法分享)。
我只提供我需要解析的语句,但语法又大又复杂。
我 运行 遇到 "code too large" 生成的 java 文件超过 65535 字节的问题 - 有时在静态初始化程序中,有时在某些方法中。
根据各个地方的建议,我将语法拆分为多个语法,并通过 import 关键字使用它们。
这种方法目前运行良好,但我必须继续添加到这个语法中
而且我相信在某些时候它会再次 运行 进入这段代码太大的问题。
另外,我也不知道拆分语法到底有多少收获。
我的问题是:
- 我们怎么知道我们再次接近代码太大问题?
- 有没有一种方法可以让我们准确测量出多少 improvement/gain
我们通过拆分语法来获得。
- 生成的文件仍然很大 - SqlParserParser.java 为 1.77MB 并且
SqlParser_SqlSubParser.java 是 1.36MB。
文件大小是否表明存在此问题?
- 除了语法拆分,还有什么可以做的吗
几点:
- 我现在无法切换到 Antlr4。
- 请尽量不要因为缺少示例而对我的问题投反对票,因为我无法 post 真正的语法和一个小示例不会重现我的问题。
据我所知,问题不在于 class 大小本身,而是方法大小。对我们来说,问题是静态初始化器(对编译器来说,它也是一种方法!)——它初始化所有的后续集和 DFA。
我们最终将 SQL 语法拆分为多个语法文件(某些 SQL 方言甚至有 6 个文件),并直接修改了部分 ANTLR(Java.stg
模板) 将大型方法和静态初始值设定项拆分为较小的方法。
我正在使用 Antlr 3.5 编写 SQL 语法(由于公司政策,我无法分享)。
我只提供我需要解析的语句,但语法又大又复杂。
我 运行 遇到 "code too large" 生成的 java 文件超过 65535 字节的问题 - 有时在静态初始化程序中,有时在某些方法中。
根据各个地方的建议,我将语法拆分为多个语法,并通过 import 关键字使用它们。
这种方法目前运行良好,但我必须继续添加到这个语法中
而且我相信在某些时候它会再次 运行 进入这段代码太大的问题。
另外,我也不知道拆分语法到底有多少收获。
我的问题是:
- 我们怎么知道我们再次接近代码太大问题?
- 有没有一种方法可以让我们准确测量出多少 improvement/gain 我们通过拆分语法来获得。
- 生成的文件仍然很大 - SqlParserParser.java 为 1.77MB 并且
SqlParser_SqlSubParser.java 是 1.36MB。
文件大小是否表明存在此问题? - 除了语法拆分,还有什么可以做的吗
几点:
- 我现在无法切换到 Antlr4。
- 请尽量不要因为缺少示例而对我的问题投反对票,因为我无法 post 真正的语法和一个小示例不会重现我的问题。
据我所知,问题不在于 class 大小本身,而是方法大小。对我们来说,问题是静态初始化器(对编译器来说,它也是一种方法!)——它初始化所有的后续集和 DFA。
我们最终将 SQL 语法拆分为多个语法文件(某些 SQL 方言甚至有 6 个文件),并直接修改了部分 ANTLR(Java.stg
模板) 将大型方法和静态初始值设定项拆分为较小的方法。