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

ANTLR lexer规则消耗太多

澹台华采
2023-03-14

我需要以下令牌:

  • 允许的字符包括大写、小写、数字、空格和连字符
  • 长度不固定(长度必须至少为两个字符)
  • 标记必须至少包含一个空格或连字符
  • 令牌必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾)

下面语法中的ANTLR lexer规则“alphanumericspacehyphen”除了一个情况外几乎都起作用。使用解析器规则“sic”进行测试,以下输入将解析(不带引号):

以下输入无法解析(没有引号):

标准行业分类:水运[4400]

问题是lexer规则“alphanumericspacehyphen”消耗了空格和“water transportation”之后的左方括号,然后lexer才意识到没有匹配,因为它做得太过分了。

我尝试过各种类型的谓词,但没有任何运气。非常感谢任何帮助。

grammar T;

sic: SICSpecifier AlphaNumericSpaceHyphen  LEFTBRACKET Digits RIGHTBRACKET;

LEFTBRACKET  
:   '[';  

RIGHTBRACKET 
:   ']';

SICSpecifier: 'STANDARD INDUSTRIAL CLASSIFICATION:';

WS : (' '|'\t')+ 
{   
  $channel = HIDDEN;  
};  

fragment UCASEALPHA : 'A'..'Z';
fragment LCASEALPHA : 'a'..'z';
fragment DIGIT : '0'..'9';
Digits: DIGIT+;

AlphaNumericSpaceHyphen 
:           (UCASEALPHA|LCASEALPHA |DIGIT|'-')+  (' ' (UCASEALPHA|LCASEALPHA |DIGIT|'-')+)+   
        |   (UCASEALPHA|LCASEALPHA |DIGIT)+ ('-')+  ((' '|UCASEALPHA|LCASEALPHA |DIGIT|'-')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?
        |   ('-')+ (UCASEALPHA|LCASEALPHA |DIGIT)+  ((UCASEALPHA|LCASEALPHA |DIGIT|'-'|' ')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?   
        ;

共有1个答案

燕英奕
2023-03-14

不幸的是,没有回溯lexer规则。你可以看看

ANTLR lexer规则即使不匹配也会消耗字符?

您可以尝试调整语法,以便按照此解决方案中的建议更改令牌的类型。

 类似资料:
  • 我在spring boot中创建了一些服务,我有11个fat jars,我将它们部署在docker容器中,我怀疑每个jar在没有任何使用的情况下消耗了1到1.5 GB的RAM,我通过运行以下命令来检查RAM: 起初我以为是java容器,我试图改成一个使用alpine的容器,但没有任何变化,所以我认为唯一的问题是我的罐子。有没有办法更改罐子正在使用的 RAM?或者这种行为是正常的,因为每个罐子都有一

  • 问题内容: 我发现从Java应用程序填充报告时,JasperReports确实很 慢 。程序挂在此行: 它通常在那里停留 3分钟,消耗高达300Mb的RAM和50%的CPU 。 是使用3个子报表的已编译(.jasper)报告。 数据源是一个很大的XML文件(大约10万行,1.5Mb) 该机器是具有4Gb RAM的3Ghz双核 那么,如何改善报表填充性能? 问题答案: 问题 看来问题出在XPath引

  • Android Studio在Mac机上消耗了太多的内存,并且还运行了多java进程。 Android Studio版本:使用Android Studio北极狐2020.3.1(补丁1构建#AI-203.7717.56.2031.7621141,构建于2021年8月7日) 当我面临内存不足的问题时,我正在监视Android Studio的内存消耗,我注意到多个“Java”进程正在运行,甚至一个进程

  • 我有一个Kafka流应用程序,它从几个主题中获取数据,并将数据加入另一个主题。 Kafka配置: 注意:我在运行Kafka Brokers的机器上运行Kafka Streams应用程序。 每小时消耗/产生数百万条记录。每当我让Kafka经纪人倒下时,都会进入再平衡阶段,再平衡大约需要30分钟,有时甚至更长时间。 有人知道如何解决Kafka消费者的再平衡问题吗?而且,很多时候,它在重新平衡时抛出异常

  • 我一直在测试许多开源动画-GIF库,以便将文件加载到我们的项目中。 它们中的大多数声称是高性能库,然而,每当我加载动画gif时,我的应用程序就会使用大约8MB的内存。 问题是,这个专用内存空间似乎永远不会被释放。我们可以看到它线性增长: 这让我怀疑我在这里做的是否正确。这种行为是正确的,还是对用户有潜在的不良影响?

  • 我们使用的是Spring kafka 2.7非阻塞重试机制。在Spring Kafka重试机制中,Kafka listenser使用来自main topic、Retry topic和DLT topic的消息,我们希望侦听器仅使用来自main和Retry topic的消息。 有没有简单的方法来进行设置? 因为我们不希望同一个消费者处理DLT消息。DLT还将被另一个进程使用,以发送请求通知。