Antlr4:使用属性值中的嵌套标记解析JSP标记
我需要解析几个JSP文件。JSP中有一条与普通HTML不同的特殊规则: 属性值(带引号的字符串)可以包含内联标记,例如以下情况有效:Antlr4:使用属性值中的嵌套标记解析JSP标记,antlr4,Antlr4,我需要解析几个JSP文件。JSP中有一条与普通HTML不同的特殊规则: 属性值(带引号的字符串)可以包含内联标记,例如以下情况有效: 嵌套标记 正常属性值:列表 正常属性值:推送模式(标签模式); 标记\关闭\斜杠:“”->popMode; 标记\u嵌套\u打开:'{tagNestLevel==0}?->流行模式; 等式:'='; 名称:[a-zA-Z][a-zA-Z0-9.::-]*; 双引号打开:“”->推送模式(双字符串模式); WS_标记:[\t\r\n]+->通道(隐藏) 模式双_字符
嵌套标记
正常属性值:列表
正常属性值:推送模式(标签模式);
标记\关闭\斜杠:“”->popMode;
标记\u嵌套\u打开:'{tagNestLevel==0}?->流行模式;
等式:'=';
名称:[a-zA-Z][a-zA-Z0-9.::-]*;
双引号打开:“”->推送模式(双字符串模式);
WS_标记:[\t\r\n]+->通道(隐藏)
模式双_字符串_模式;
双引号关闭:“”->popMode;
DOUBLE_QUOTE_STRINGTAG_CLOSE_SLASH:'一般来说,是的。通常,解决方案涉及使用递归模式。显示到目前为止您所做的工作以获得更详细的帮助。@GRosenberg是的,我使用了递归模式。但问题是,当我遇到一个信息不足,无法提供进一步帮助时。@GRosenberg请查看更新。
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 : ~["<]+;