说我有一段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”所以这似乎是完全不可理解的。你有什么想法?
答案 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"
(包括空格)不匹配:您必须做错事。