antlr4:如何在没有生产规则的情况下为令牌生成侦听器回调?

时间:2015-11-18 03:24:32

标签: antlr4

在我调查article中引用的语法之后,很明显问题的关键在于这些生产规则:

TIMESPAN  : startTime (WS THRU WS endTime)? ;
startTime : TOD ;
endTime   : TOD ;

中间生成规则startTimeendTime的原因是为那些人生成监听器回调,因此我不必在TIMESPAN监听器中显式解析它们。但显然,这会混淆antlr4解析器。为了解决这个问题,我将规则简化如下:

TIMESPAN  : TOD (WS THRU WS TOD)? ;

并进一步改变了这一点:

TIMESPAN  : (TOD THRU TOD) | TOD ;

这些规则中的任何一个都会使语法编译。

由于antlr4不再支持这样的标签:

TIMESPAN  : (startTime=TOD THRU endTime=TOD) | startTime=TOD ;

我的问题是如何对此语法的输入进行标记,以便捕获startTimeendTime

感谢。

1 个答案:

答案 0 :(得分:1)

我相信这里的答案是在antlr:

  • 左侧大写的生产规则包含与词法分析相关的规则 - 也就是说,您实际上获得了逻辑可以相应处理的令牌。
  • 左侧未大写的生产规则包括与解析器相关的规则 - 即,将左侧进一步分解为表达式(即其他生产规则),令牌或两者的规则。

antlr4中的侦听器是一个合适的位置,您可以在其中拦截适当的解析器规则的结果。在此示例中,您将设置一个在侦听器回调中设置startTimeendTime的侦听器 - 然后在完成树遍历时,根据需要使用这些值。