当前位置: 首页 > 知识库问答 >
问题:

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

百里星纬
2023-03-14

看起来lexer操作中的getText()无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法有以下规则用于解析C++样式的标识符,这些规则支持\u序列将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
dkk
uzzzz

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

dkk\u
uzzzz

为什么lexer规则identifier的getText()不同于解析器id_token规则的$text。毕竟,解析器规则只包含这个lexer规则?

编辑:

在ANTLR4.1中发现问题,但在ANTLR4.2中未发现,因此可能已经修复。

共有1个答案

南宫才英
2023-03-14

根据您的例子很难判断,但我的直觉是您使用的是旧版本的antlr。我无法在ANTLR4.2中复制此问题。

 类似资料:
  • 我们计划在客户机-服务器模式下使用Infinispan。该架构有许多客户端(客户端1、客户端2等)和分布式infinispan网络。 我们需要定期更新缓存中的数据,比如每5小时更新一次。所有客户端都可以更新数据。如果其中一个(比如客户端1)正在更新,我们需要防止其他人做同样的工作。更新完成后,所有客户端再等待5个小时,其中任何一个客户端都将再次进行更新。 Infinispan为此提供了版本化操作,

  • Apache2.4PHP5.5 我绝对肯定,比我的和文件位于中 我还将这些文件交给了我在OSX Maverics上的同事,效果很好 我无法使php gettext正常工作。 我已经谷歌/堆栈溢出了大约几个小时,尝试了各种解决方案——仍然不起作用。我做错了什么? 每次更改某些内容以确保重新加载gettext文件时,我都会重新启动apache。 这是我的输出: 还有一个cmd输出: 好吧,我想起来了:

  • 我一直在尝试建立一个PHP网站。不管我怎么努力,我都无法让gettext开始工作。 我正在运行一个ubuntu apache服务器上的流浪框,我需要的所有区域设置都是可用的和生成的(使用区域设置-a检查)。 已安装并启用Gettext(使用phpinfo()检查) 这是我的PHP: 这是我的/vagrant/build/locale/en_US/LC_MESSAGES/en_US。采购订单文件:

  • 问题内容: 在redux中,当调度一个动作时,reducer将相应地更改状态,调用该动作的组件也可以访问该状态(由Provider通过props传递)。我对吗? 状态是访问组件中操作结果的唯一方法吗?(已调用操作的组件)。 如何将回调函数传递给操作,然后使用该方法将结果发送回组件? 问题答案: 在redux中,当调度一个动作时,reducer将相应地更改状态,调用该动作的组件也可以访问该状态(由P

  • 问题内容: 我想转换成 我用了 但是我明白了 问题答案: 每月使用CAPITAL M, 另外,您首先要设置日期,然后再重置日历,我想这不是您想要的,可能是因为您需要将其更改为以下内容 看到 API文件