Мне нужно проанализировать несколько файлов JSP.В JSP есть специальное правило, которое отличается от обычного HTML:
Значение атрибута (строка в кавычках) может содержать встроенный тег, например, допустимы следующие случаи:
<a value="<b v="123"/>"></a>
вложенные теги <a value="List<String>"></a>
нормальное значение атрибута: List<String>
<a value="<"></a>
нормальное значение атрибута: <
Я пытался использоватьрежим лексера, который может обрабатывать случай 1, но не может обрабатывать случаи 2 и 3.
Можно ли использовать Antrl4 для анализа такого текста?
ОБНОВЛЕНИЕ
Упрощенная версия моего лексера:
lexer grammar JSPLexer;
@members{
private int tagNestLevel;
}
TAG_OPEN : '<' { tagNestLevel = 0; } -> pushMode(TAG_MODE);
TAG_CLOSE_SLASH : '</' -> pushMode(TAG_MODE);
mode TAG_MODE;
TAG_SLASH_CLOSE : '/>' -> popMode;
TAG_NEST_OPEN : '<' { tagNestlevel++; } -> type(TAG_OPEN), pushMode(TAG_MODE)
TAG_CLOSE : '>' { tagNestLevel == 0 }? -> popMode;
EQ : '=';
NAME : [a-zA-Z] [a-zA-Z0-9_.:-]*;
DOUBLE_QUOTE_OPEN : '"' -> pushMode(DOUBLE_STRING_MODE);
WS_TAG : [ \t\r\n]+ -> channel(HIDDEN)
mode DOUBLE_STRING_MODE;
DOUBLE_QUOTE_CLOSE : '"' -> popMode;
DOUBLE_QUOTE_STRINGTAG_CLOSE_SLASH : '</' -> type(TAG_CLOSE_SLASH), pushMode (TAG_MODE);
DOUBLE_QUOTE_STRING_TAG_OPEN : '<' { tagNestLevel = 0; } ->type(TAG_OPEN), pushMode (TAG_MODE);
DOUBLE_QUOTE_TEXT : ~["<]+;