似乎lexer操作中的getText()无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法有这些规则 解析支持\ u序列的C ++样式标识符,以将unicode字符作为标识符名称的一部分嵌入:
grammar CPPDefine;
cppCompilationUnit: (id_token|ALL_OTHER_SYMBOL)+ EOF;
id_token:IDENTIFIER //{System.out.println($text);}
;
CRLF: '\r'? '\n' -> skip;
ALL_OTHER_SYMBOL: '\\';
IDENTIFIER: (NONDIGIT (NONDIGIT | DIGIT)*)
{System.out.println(getText());}
;
fragment DIGIT: [0-9];
fragment NONDIGIT: [_a-zA-Z] | UNIVERSAL_CHARACTER_NAME ;
fragment UNIVERSAL_CHARACTER_NAME: ('\\u' HEX_QUAD | '\\U' HEX_QUAD HEX_QUAD ) ;
fragment HEX_QUAD: [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f];
使用包含不正确的unicode转义序列的标识符的1行输入进行测试:
dkk\uzzzz
id_token
解析器规则操作的$ text产生了正确的结果:
dkk
uzzzz
即。输入被解释为由符号分隔的2个标识符' \' (符号' \'不由任何解析器规则打印)。
然而,IDENTIFIER词法分析器规则操作的getText()会产生不正确的结果:
dkk\u
uzzzz
为什么词法分析器规则IDENTIFIER
的getText()与解析器id_token
规则的$ text不同。毕竟,解析器规则只包含此词法分析器规则吗?
编辑:
在ANTLR4.1中观察到的问题,但在ANTLR4.2中没有,所以它本来可以修复。
答案 0 :(得分:1)
根据你的例子很难分辨,但我的直觉是你使用的是旧版本的ANTLR。我无法在ANTLR 4.2中重现此问题。