Antlr 如何允许标识符以数字开头而不会导致不匹配的TokenException
我想匹配以下输入:Antlr 如何允许标识符以数字开头而不会导致不匹配的TokenException,antlr,antlr3,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 :
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';
但它会导致一个错误:
不匹配的TokenException:第1:15行不匹配的输入“1m”应为“\u0004”
有人知道如何解决这个问题吗
谢谢
Charles我认为你的语法是上下文敏感的,即使是在词汇分析器(标记器)级别。字符串“1m”被识别为IDENT,而不是后跟“m”的整数。您可以重新定义语法,或者使用谓词解析,或者在语法中嵌入Java代码来检测上下文(例如,如果数字出现在“span”之后,后跟“=”,则将其解析为整数)