Грамматике Antlr4 не хватает памяти — что делать?

#antlr #antlr4

Вопрос:

У меня очень длинный файл грамматики antlr4, и недавно я столкнулся с ошибкой, которая выглядит следующим образом

 Exception in thread "main" java.lang.UnsupportedOperationException: Serialized ATN data element 68939 element 11 out of range 0..65535
    at org.antlr.v4.runtime.atn.ATNSerializer.serialize(ATNSerializer.java:361)
    at org.antlr.v4.runtime.atn.ATNSerializer.getSerialized(ATNSerializer.java:601)
    at org.antlr.v4.Tool.generateInterpreterData(Tool.java:745)
    at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:400)
    at org.antlr.v4.Tool.process(Tool.java:361)
    at org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:328)
    at org.antlr.v4.Tool.main(Tool.java:172)
 

Я видел предыдущие вопросы, и оказалось, что это проблема с памятью. Я также выполнил полное упражнение по отладке и уменьшил грамматику до тех пор, пока эта ошибка не исчезнет несколько раз с несколькими частями грамматики, и, похоже, не существует какого-либо конкретного бита грамматического кода, который вызывает ошибку, это просто размер. Как только я уменьшаю грамматику ниже определенного размера, независимо от того, что я удаляю, она снова начинает работать. Итак, мой вопрос: есть ли какой-либо способ обойти эту проблему в antlr4? Например, используя компьютер с большей оперативной памятью, Укажите параметр при запуске antlr4, Который увеличивает максимально допустимый размер грамматики и т. Д., Или сокращение грамматики является единственно возможным решением (если не использовать antlr4 и попробовать совершенно другой анализатор)?

Комментарии:

1. Как указано в моем (удаленном) ответе: это не проблема с памятью, связанная с ошибкой: Serialized ATN data element 68939 element 11 out of range 0..65535

2. Я вижу. Знаете ли вы, в чем проблема на самом деле? Ошибка кажется немного расплывчатой, и я не уверен, к чему относится диапазон до 65535. Самое главное: знаете ли вы, есть ли способ избежать этого или обойти его, за исключением уменьшения размера грамматики? Или это ограничение размера просто укоренилось в antlr4, так что для этого нет решения? Большое спасибо!

3. Уменьшите количество ключевых слов: github.com/antlr/antlr4/issues/1863 . AFAIK, нет предопределенного количества ключевых слов. Но обычно максимальное значение никогда не достигается при использовании ANTLR, поскольку оно «должно» использоваться. Бьюсь об заклад, вы находитесь в аналогичной ситуации, как человек, который открыл проблему в Github, где количество ключевых слов было абсурдно большим. Чтобы получить более конкретные ответы, поделитесь грамматикой.

4. Судя по проблеме, у меня точно такая же проблема. К сожалению, я не могу поделиться грамматикой, но она использовалась способом, который немного выходит за рамки обычного назначения грамматики, отсюда и тысячи ключевых слов. По крайней мере, теперь я знаю, что в antlr4 существует ограничение памяти и что с этим ничего не поделать. Большое спасибо за подтверждение.