在我调查article中引用的语法之后,很明显问题的关键在于这些生产规则:
TIMESPAN : startTime (WS THRU WS endTime)? ;
startTime : TOD ;
endTime : TOD ;
中间生成规则startTime
和endTime
的原因是为那些人生成监听器回调,因此我不必在TIMESPAN监听器中显式解析它们。但显然,这会混淆antlr4
解析器。为了解决这个问题,我将规则简化如下:
TIMESPAN : TOD (WS THRU WS TOD)? ;
并进一步改变了这一点:
TIMESPAN : (TOD THRU TOD) | TOD ;
这些规则中的任何一个都会使语法编译。
由于antlr4不再支持这样的标签:
TIMESPAN : (startTime=TOD THRU endTime=TOD) | startTime=TOD ;
我的问题是如何对此语法的输入进行标记,以便捕获startTime
和endTime
?
感谢。
答案 0 :(得分:1)
我相信这里的答案是在antlr:
antlr4中的侦听器是一个合适的位置,您可以在其中拦截适当的解析器规则的结果。在此示例中,您将设置一个在侦听器回调中设置startTime
和endTime
的侦听器 - 然后在完成树遍历时,根据需要使用这些值。