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

时间:2011-11-14 20:22:23

标签: antlr whitespace grammar lexer

说我有一段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会占用令牌之间的所有空白区域,因此“x y z”和“xyz”都应该被识别为Ident的相同标记。但显然只有“x y z”才会被认为是3个身份。因此,当遇到词法规则时遇到空格时,我真的感到困惑。

更具体地说,我有一条规则

VARIABLE: ('A'..'Z')+ DIGIT*  ;

我希望它识别变量身份,如X3,Y4,XX55等。但令人惊讶的是,这条规则承认“X Y”所以这似乎是完全不可理解的。你有什么想法?

2 个答案:

答案 0 :(得分:3)

Ident : LETTER (LETTER | DIGIT)*;表示 Ident 是一个字母后跟零个或多个字母或数字。 没有空格!
这就是为什么" x y z"被识别为3 Ident

答案 1 :(得分:1)

虽然您已将WS放在HIDDEN频道上,但"x y z"有三个Ident令牌,因为WS令牌仅在解析器规则中被丢弃,在词法分析器规则中

  

更具体地说,我有一条规则

   VARIABLE: ('A'..'Z')+ DIGIT*  ;
     

我希望它识别变量身份,如X3,Y4,XX55等。但令人惊讶的是,这条规则承认“X Y”所以这似乎是完全不可理解的。你有什么想法?

不,规则VARIABLE" X Y"(包括空格)不匹配:您必须做错事。