Вы не можете легко написать лексер для него, вам нужны правила синтаксического анализа. Два правила должно быть достаточно. Один отвечает за сопоставление фигурных скобок, другой - за сопоставление знаков равенства.
Примерно так:
braces : '[' ']'
| '[' equals ']'
;
equals : '=' equals '='
| '=' braces '='
;
Это должно охватывать описанный вами вариант использования. Не абсолютный страх, но, возможно, вам придется использовать предикат в первом правиле «равных», чтобы избежать двусмысленных интерпретаций.
Edit:
Трудно интегрировать ваше жадное правило и в то же время избежать переключения контекста лексера или чего-то подобного (сложно в ANTLR). Но если вы хотите немного интегрировать Java в свой грамматик, вы можете написать правило лексера.
В следующем примере грамматики показано, как:
grammar TestLexer;
SPECIAL : '[' { int counter = 0; } ('=' { counter++; } )+ '[' (options{greedy=false;}:.)* ']' ('=' { counter--; } )+ { if(counter != 0) throw new RecognitionException(input); } ']';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
rule : ID
| SPECIAL
;