假设我有一段ANTLR语法(lexer部分)
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
Ident : LETTER (LETTER | DIGIT)*;
WS : (' ' | 't' | 'n' | 'r' | 'f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('n'|'r') {$channel = HIDDEN;};
我认为,由于WS吃掉了令牌之间的所有空白,"xyz"one_answers"xyz"都应该被识别为Ident的相同令牌。但显然只有"x y z"会被认为是3 Ident。因此,当lexer规则遇到空白时,我真的感到困惑。
更具体地说,我有一个规则VARIABLE: ('A'..'Z')+ DIGIT* ;
我想让它识别变量的身份,如X3, Y4, XX55等。但令人惊讶的是,这个规则识别出了"X Y",所以这看起来完全不可理解。你的想法是什么?
Ident : LETTER (LETTER | DIGIT)*;
表示标识是一个字母后面跟着零个或多个字母或数字。没有空格!
这就是为什么"x y z"被识别为3 Ident
虽然您已经将WS
放在HIDDEN
通道上,但"x y z"
是三个Ident
令牌,因为WS
令牌仅在解析器规则中被丢弃,不是词法分析器规则中的。
更具体地说,我有一个规则VARIABLE: ('A'..'Z')+ DIGIT* ;
我想让它识别变量的身份,如X3, Y4, XX55等。但令人惊讶的是,这个规则识别出了"X Y",所以这看起来完全不可理解。你的想法是什么?
不,规则VARIABLE
不匹配" X Y"
(包括空格):你一定做错了什么