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

ANTLR4:消耗所有剩余输入直到EOF

危寒
2023-03-14
"cycle in freerun" <EOF>
"runtime <= 20m" <EOF>
"grab enabled" <EOF>

ANTLR愉快地将所有的表达解析成成分,听者作用于相关的成分,生活是快乐的。下面是语法的一个代表性片段:

expr               // <-- Start rule
  : freq_p EOF
  | cycle_p EOF
  ...              // Many more, ad nauseum
  ;

freq_p  : FREQ '=' INT | FREQ '<' INT ;

cycle_p : CYCLE IN cycles ;
cycles  : cycle (',' cycle)* ;
cycle   : PHASELOCK | FREERUN ;

// Keywords
CYCLE     : 'cycle' ;
FREERUN   : 'freerun' ;
FREQ      : 'frequency' ;
IN        : 'in' ;
PHASELOCK : 'phaselock' ;

INT       : '0'..'9'+ ;
WS        : [ \n\t\r]+ -> skip ;

但现在,我需要扩展语法以合并两个新表达式,这两个表达式都以接受任何字符序列(包括Unicode)结束,直到EOF。示例输入:

"echo = Confirm 'interlock' is clear,\n and actuate \"frequency\" button." <EOF>
"report Process complete." <EOF>

我很难在语法中表达对EOF的所有输入的接受。以下变化导致痛苦:

expr
  ...
  : echo_p EOF
  : report_p EOF
  ...

echo_p   : ECHO   '=' REMAINING ; // Snarfs all remaining input until EOF
report_p : REPORT     REMAINING ; // Ditto

ECHO     : 'echo' ;
REPORT   : 'report' ;

REMAINING : <WHAT_GOES_HERE?> ;  // .* messes up everything else

如何才能做到这一点?期望的结果是,解析树侦听器将获得文本值,如refling().getText()

我尝试将剩余写入单独的lexer grammar导入中,但遇到https://github.com/antlr/antlr4/issues/160和编译时警告。IntelliJ ANTLR插件也会出现故障,这对生产力有负面影响。我了解到包含使用模式的lexer语法是不受支持的,至少在ANTLR4.3中是这样。

lexer grammar Remainder;

@lexer::members {
// Needed at least until ANTLR issue #160 is fixed.
public static final int CONSUME_ALL = 123;
}

REMAINING : . -> more, mode(CONSUME_ALL) ;

mode CONSUME_ALL;

TEXT : .* ; // Consume all remaining input

共有1个答案

彭允晨
2023-03-14

您应该通过向中添加使.*不贪婪:

REMAINING : .*? ;

这将消耗所有内容,直到找到EOF

查看此处:https://theantlrguy.atlassian.net/wiki/display/antlr4/wildcard+operator+and+nongreedy+subrules

 类似资料:
  • 问题内容: 这是代码: 如何在保持同一行的同时使输入元素扩展为填充所有剩余空间?如果我100%投入,它会走自己的线… 问题答案: 可以在IE7 +和所有现代浏览器中使用。 在首先必须走在HTML。有点令人反感,但值得一看。 关键步骤是使用:为何需要这样做的解释如下: 多余的跨度是必需的,因为它对以下内容没有影响:[CSS/DOM中的什么阻止了带有display:块的输入框扩展到其容器的大小

  • 问题内容: 如何实现以下目标: 左对齐 右对齐 占据父级中的所有剩余宽度 左对齐,也必须左对齐 二者并应服从作为最大尽可能别处定义字体属性。在窗口内居中对齐,并且自然可以具有任意宽度。 请指教。 问题答案: 更新 [2016年10月]:Flexbox版本… 原始答案[2011年4月]:无表CSS版本(表行为)… CSS …

  • 我需要用div填充下的的剩余垂直空间。 我需要一个唯一的CSS解决方案。

  • 我们最近将我们的银行应用程序从Java1.6升级到1.8,并将JBoss4.x升级到WildFly10.1。 我们观察到java消耗了机器上可用的所有内核(10)。 有人能说出是什么原因吗,在JBoss4.x中,通常最大CPU利用率是4个核心。 下面是(添加到消耗高cpu的进程上)的结果 pS-elo pid,lwp,nlwp,ruser,pcpu,stime,etime,argsgrep 363

  • 问题内容: 我需要填写 剩余的垂直空间 的下用DIV。 我只需要一个CSS解决方案。 问题答案: 您可以像这样在div 上执行此操作: 小提琴 CSS: 编辑:替代解决方案 根据您的布局和这些div中的内容,可以使它变得更简单,并且标记更少,如下所示: HTML: CSS:

  • 问题内容: 我为我使用的API提供了一个速率限制器,它每秒允许20个请求。所有请求均基于承诺,并且一旦有响应,承诺将使用API​​数据进行解析。 问题: 我设置了一个promiseArray,其中包含58k个都在等待响应的Promise。如此缓慢地增加内存,直到内存用完。在我的特定情况下,我不需要将解析的数据传递给我,并且数据耗尽了我所有的RAM。 编码: 那么,有没有一种方法可以等待到promi