Как исправить ошибку JavaCC/jjTree «Код метода jjMoveNfa_0 (int, int) превышает ограничение в 65535 байт»

Я пишу парсер файлов, используя генератор парсеров JavaCC/jjTree (https://javacc.org/)

Поскольку файлы, подлежащие анализу, содержат много данных нестандартным образом (имеется в виду: без CSV и т. д.), определение грамматики для генератора синтаксического анализатора приводит к большому количеству определений TOKEN.

В какой-то момент автоматически сгенерированный код для «TokenManager» превышает ограничение в 65,535 байт в методе «private int jjMoveNfa_0(int startState, int curPos)».

Итак, мой вопрос: как можно передать параметр (или убедить генератор кода JavaCC/jjTree любым другим способом) сгенерировать код, который не нарушает ограничений?


person MB_IAMS    schedule 02.08.2019    source источник
comment
Эй, ты нашел решение?   -  person Yougesh    schedule 03.09.2019
comment
Нет, к сожалению нет. По крайней мере, не тот, на который я надеялся. Я пытаюсь обойти проблему, определяя больше методов в грамматике для структур вместо сложных токенов, чтобы уменьшить количество необходимых токенов. Но в какой-то момент человек снова достигает предела. Я думаю, что это неотъемлемая проблема того, как JavaCC генерирует код с константами для каждого токена и переключателем для каждого из них. Итак, ключевая проблема, на мой взгляд, заключается в том, что можно иметь только максимальное количество токенов...   -  person MB_IAMS    schedule 04.09.2019
comment
Я так понимаю столкнулся с той же проблемой   -  person Yougesh    schedule 04.09.2019
comment
Пожалуйста, напишите, если вы нашли какое-либо решение для этого, я сделаю то же самое.   -  person Yougesh    schedule 16.09.2019


Ответы (1)


Я столкнулся с той же проблемой. Причина заключалась в определении моих токенов. У меня было много следующих определений:

< MY_TOKEN : "MY_TOKEN" | "TOKEN_VARIANT1" | "TOKEN_VARIANT2" | "TOKEN_VARIANT3" >

Поэтому мне нужно использовать только в операторе парсера

< MY_TOKEN >

Решение:

Разделите определение на:

< MY_TOKEN : "MY_TOKEN">
| < TOKEN_VARIANT1 : "TOKEN_VARIANT1" >
| < TOKEN_VARIANT2 : "TOKEN_VARIANT2" >
| < TOKEN_VARIANT3 : "TOKEN_VARIANT3" >

Измените определение парсера на

< MY_TOKEN > | < TOKEN_VARIANT1 > | < TOKEN_VARIANT2 > | < TOKEN_VARIANT3> 
person Carsten Zaddach    schedule 03.11.2020