Antlr4:在属性值

时间:2018-05-10 13:06:48

标签: antlr4

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

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

  1. <a value="<b v="123"/>"></a>嵌套代码
  2. <a value="List<String>"></a>普通属性值:List<String>
  3. <a value="<"></a>正常属性值:<
  4. 我尝试使用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   :   ~["<]+;                     
    

0 个答案:

没有答案