代码之家  ›  专栏  ›  技术社区  ›  Aeris

如何允许标识符以数字开头而不引起MismatchedTokenException

  •  0
  • Aeris  · 技术社区  · 11 年前

    我想匹配以下输入:

    statement span=1m 0_dur=12
    

    具有以下语法:

    options {
    language = Java;
    output=AST;
    ASTLabelType=CommonTree; 
    }
    
    statement :'statement' 'span' '=' INTEGER 'm' ident '=' INTEGER;
    
    INTEGER 
    :   DIGIT+
        ;
    
    ident : IDENT | 'AVG' | 'COUNT';
    
    IDENT
    :   (LETTER | DIGIT | '_')+  ;
    
    WHITESPACE  
    :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
        ;
    
    fragment 
    LETTER : ('a'..'z' | 'A'..'Z') ;
    
    fragment 
    DIGIT : '0'..'9';
    

    但它会导致一个错误:

    MismatchedTokenException:行1:15输入“1m”不匹配,应为“\u0004”

    有人知道如何解决这个问题吗?

    谢谢 查尔斯

    1 回复  |  直到 11 年前
        1
  •  0
  •   Benjamin    11 年前

    我认为你的语法是上下文敏感的,即使在词法分析器(Tokenizer)级别也是如此。字符串“1m”被识别为IDENT,而不是后面跟着“m”的INTEGER。您可以重新定义语法,或者使用谓词解析,或者在语法中嵌入Java代码来检测上下文(例如,如果数字在“span”后面跟着“=”,则将其解析为INTEGER)。