Тип генерирует строку, которая требует более 65535 байт для кодирования в формате Utf8 в пуле констант.

Я пробую antlr4 с несколько большой грамматикой, которая работала в antlr3. Проработал 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 требуются какие-то новые настройки, о которых я не знаю (?)


person joehitt    schedule 17.01.2013    source источник


Ответы (1)


Это действительно ограничение в Java, а не ошибка в ANTLR (создается правильная строка сериализации, но кодировка Java не может ее сохранить). На прошлой неделе мы подправили представление _serializedATN, чтобы решить эту проблему, но мы не реализовали полный обходной путь, включающий разбиение сериализованной формы на несколько строк или разрешение ее хранения в отдельном файле, загружаемом во время выполнения.

Могут быть некоторые способы настроить грамматику, чтобы уменьшить размер требуемого ATN, но мне нужно увидеть грамматику, чтобы оценить это.

Обновление: Начиная с ANTLR 4.1, _serializedATN теперь разделяется по мере необходимости, чтобы не допустить превышения лимита постоянного пула в сгенерированном коде. Подробности см. в проблеме 76.

person Sam Harwell    schedule 17.01.2013