Antlr4:使用属性值中的嵌套标记解析JSP标记

Antlr4:使用属性值中的嵌套标记解析JSP标记,antlr4,Antlr4,我需要解析几个JSP文件。JSP中有一条与普通HTML不同的特殊规则: 属性值(带引号的字符串)可以包含内联标记,例如以下情况有效: 嵌套标记 正常属性值:列表 正常属性值:推送模式(标签模式); 标记\关闭\斜杠:“”->popMode; 标记\u嵌套\u打开:'{tagNestLevel==0}?->流行模式; 等式:'='; 名称:[a-zA-Z][a-zA-Z0-9.::-]*; 双引号打开:“”->推送模式(双字符串模式); WS_标记:[\t\r\n]+->通道(隐藏) 模式双_字符

我需要解析几个JSP文件。JSP中有一条与普通HTML不同的特殊规则:

属性值(带引号的字符串)可以包含内联标记,例如以下情况有效:

  • 嵌套标记
  • 正常属性值:
    列表
  • 正常属性值:
    推送模式(标签模式);
    标记\关闭\斜杠:“”->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   :   ~["<]+;