Я ищу способ сделать определенные токены нечувствительными к регистру в моем анализаторе ANLTR. Что я уже пробовал:
Преобразование моего ввода во все строчные буквы. Это не сработало для некоторых части моей грамматики требуют учета регистра.
Сохранение прописной и строчной версии токенов. Это также не сработало, потому что мой файл лексера стал слишком большим (нарушение ограничения ANTLR в 64 КБ).
Я надеюсь, что существует какой-то трюк с регулярным выражением или, может быть, флаг ANTLR, который говорит синтаксическому анализатору обрабатывать определенные токены по-разному.
Пример:
SENSITIVETOKEN
:
'footoken'
;
INSENSITIVETOKEN
:
'bootoken' (some magic here)
;
Лексер должен распознает "BOOTOKEN"
как INSENSITIVETOKEN
но нет"FOOTOKEN"
как SENSITIVETOKEN
Спасибо за вашу помощь! ^^
Одним из возможных решений может быть объявление однобуквенных фрагментов и создание токенов на основе этих фрагментов.
Пример:
INSENSITIVETOKEN
:
B O O T O K E N
;
fragment B: ('B'|'b');
fragment O: ('O'|'o');
fragment T: ('T'|'t');
fragment K: ('K'|'k');
fragment E: ('E'|'e');
fragment N: ('N'|'n');
Или, если не так много токенов, нечувствительных к регистру, просто:
INSENSITIVETOKEN
:
('B'|'b')('O'|'o')('O'|'o')('T'|'t')('O'|'o')('K'|'k')('E'|'e')('N'|'n')
;
Спасибо за быстрый ответ. Но мой файл грамматики сейчас составляет около 4700 строк. Я не думаю, что смогу изменить все это вручную.
@JakobSachs, поскольку эти правила без учета регистра являются частью грамматики, вам нужно изменить грамматику, чтобы получить желаемый результат. Я не думаю, что есть какое-то другое решение для этого.
@PavelSmirnov Хорошо, спасибо. Думаю, я попытаюсь написать скрипт, который изменит его автоматически.
Примечание: вы можете сделать это еще короче, например.
fragment B: [bB];