如何允许一个可以以数字开头而不会导致MismatchedTokenException的标识符

时间:2013-04-16 03:13:08

标签: antlr antlr3

我想匹配以下输入:

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 个答案:

答案 0 :(得分:0)

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