该类型生成一个字符串,该字符串需要超过65535个字节才能在常量池中以Utf8格式进行编码

时间:2013-01-17 14:51:20

标签: antlr4

我正在尝试使用在antlr3中运行的有点大语法的antlr4。完成了所需的2个语法更改,现在我有了生成词法分析器和解析器的工具。

但是,词法分析器有一个编译错误:

  

1)该类型生成一个需要超过65535个字节的字符串   在常量池中以Utf8格式编码

错误出现在Eclipse上的类名,所以不确定它正在讨论哪个字符串,但我怀疑它是这个非常长的字符串:

    public static final String _serializedATN =
        "\1\2\u01c5\u1741\6\uffff\2\0\7\0\2\1\7\1\2\2\7\2\2\3\7\3\2\4\7\4\2\5\7"+
        "\5\2\6\7\6\2\7\7\7\2\b\7\b\2\t\7\t\2\n\7\n\2\13\7\13\2\f\7\f\2\r\7\r\2"+
... etc, etc (few hundred lines of unicode)

看起来像解析器生成器中的一个错误,但是可能有一些新的设置需要antlr4我不知道(?)

1 个答案:

答案 0 :(得分:3)

这实际上是Java中的限制,而不是ANTLR中的错误(创建了正确的序列化字符串,但Java的编码无法存储它)。上周我们tweaked the _serializedATN代表帮助解决了这个问题,但我们还没有实现一个完整的解决方法,包括将序列化表单分成多个字符串或允许其存储在运行时加载的单独文件中。

可能有一些方法可以调整语法以减少所需ATN的大小,但我需要查看语法来评估它。

更新:从ANTLR 4.1开始,_serializedATN现在根据需要进行拆分,以确保生成的代码中不超过常量池限制。有关详细信息,请参阅issue 76