我需要解析一些JSP文件。 JSP中有一条与普通HTML不同的特殊规则:
属性值(带引号的字符串)可以包含内联标记,例如以下情况有效:
<a value="<b v="123"/>"></a>
嵌套代码<a value="List<String>"></a>
普通属性值:List<String>
<a value="<"></a>
正常属性值:<
我尝试使用lexer模式,它可以处理案例1,但未能处理案例2&amp; 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 : ~["<]+;