Также вы можете отслеживать где-то в lexer, сколько идентификационных элементов предшествует первой строке и передать их парсеру. Самая интересная часть будет пытаться передать его парсеру правильно :) Если ваш синтаксический анализатор использует lookahead (здесь я имею в виду, что синтаксический анализатор может запрашивать переменное число токенов, прежде чем он действительно будет соответствовать даже одному), тогда попытка передать его через одну глобальную переменную кажется это очень плохая идея (потому что lexer может проскользнуть на следующей строке и изменить значение счетчика отступа, в то время как парсер все еще пытается разобрать предыдущую строку). Кроме того, во многих других случаях глобалы являются злыми;) Маркировка первой строки «реальный» токен каким-то образом с помощью счетчика отступов более разумна. Я не могу дать вам точный пример (я даже не знаю, какие генераторы парсера и лексера вы собираетесь использовать, если есть какие-либо ...), но что-то вроде хранения данных в токенах первой строки (это может быть неудобно, если вы можете " t легко получить такой токен от парсера) или сохранить пользовательские данные (карта, которая связывает токены с отступом, массив, где каждая строка в исходном коде как индекс и значение отступа в качестве значения элемента), кажется, достаточно. Одним из недостатков этого подхода является дополнительная сложность анализатора, которая должна будет различать значения идентификаторов и изменять их поведение на основе этого. Что-то вроде LOOKAHEAD ({yourConditionInJava}) для JavaCC может работать здесь, но это NOT очень хорошая идея. Множество дополнительных токенов в вашем подходе, кажется, менее злая вещь для использования :)
В качестве другой альтернативы я бы предложил использовать эти два подхода. Вы можете создавать дополнительные токены только тогда, когда счетчик отступа изменяет свое значение на следующей строке. Это похоже на искусственный маркер BEGIN и END. Таким образом, вы можете уменьшить количество «искусственных» токенов в потоке, поданных в парсер из lexer. Только ваша грамматика парсера должна быть скорректирована для понимания дополнительных токенов ...
Я не пробовал это (не имею никакого реального опыта в анализе таких языков), просто делясь мыслями о возможных решениях. Проверка уже построенных парсеров для таких языков может быть для вас очень полезной. Открытый исходный код - ваш друг;)