Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR4 Lexer操作调用getText()时的结果不正确_Antlr4 - Fatal编程技术网

ANTLR4 Lexer操作调用getText()时的结果不正确

ANTLR4 Lexer操作调用getText()时的结果不正确,antlr4,Antlr4,lexer操作中的getText()似乎无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法中有以下规则 解析支持U-Unode的C++样式标识符,将Unicode字符嵌入标识符名称的一部分: grammar CPPDefine; cppCompilationUnit: (id_token|ALL_OTHER_SYMBOL)+ EOF; id_token:IDENTIFIER //{System.out.println($text);} ; CRLF: '\r'? '\n' ->

lexer操作中的getText()似乎无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法中有以下规则 解析支持U-Unode的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\u令牌的$text
解析器规则操作生成以下正确结果:

dkk
uzzzz
dkk\u
uzzzz
i、 e.输入解释为两个标识符,由符号“\”分隔(符号“\”不由任何解析器规则打印)

但是,标识符lexer规则操作的getText()会产生以下错误结果:

dkk
uzzzz
dkk\u
uzzzz
为什么lexer规则
标识符
的getText()与解析器
id\u标记
规则的$text不同。毕竟,解析器规则只包含这个lexer规则

编辑:


在ANTLR4.1中观察到问题,但在ANTLR4.2中未观察到问题,因此它可能已经被修复。

根据您的示例很难判断,但我的直觉是您使用的是旧版本的ANTLR。我无法在ANTLR 4.2中复制此问题。

能否请您提供完整的示例以复制此问题?我已将示例更新为完整的语法。如前所述,输入为1行。问题出现在v4.1中。在v4.2中没有观察到这个问题。如果它不是故意修复的,那么它可能会被意外隐藏。@javamani完全重写了4.2的lexer操作索引处理。