为什么令牌规则(在ANTLR中)" IDENT : LETTER (LETTER | DIGIT)*; "不识别"x y z"?



假设我有一段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"(包括空格):你一定做错了什么

最新更新