antlr4:如何在没有生产规则的情况下为令牌生成监听器回调?
antlr4: how to generate listener callback for token without a production rule?
我研究了中引用的语法后,很明显问题的症结集中在这些产生式规则上:
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
?
谢谢。
我相信这里的答案是在 antlr 中:
- 左侧大写的生产规则包含与词法分析器相关的规则——也就是说,您实际上得到了您的逻辑随后可以相应处理的标记。
- 左侧未大写的产生式规则包含与解析器相关的规则——也就是说,将左侧进一步分解为表达式(即附加产生式规则)、标记或两者。
antlr4 中的侦听器是一个合适的地方,您可以在其中拦截适当解析器规则的结果。在此示例中,您将设置一个在侦听器回调中设置 startTime
和 endTime
的侦听器——然后在树遍历完成后,根据需要使用这些值。
我研究了
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
?
谢谢。
我相信这里的答案是在 antlr 中:
- 左侧大写的生产规则包含与词法分析器相关的规则——也就是说,您实际上得到了您的逻辑随后可以相应处理的标记。
- 左侧未大写的产生式规则包含与解析器相关的规则——也就是说,将左侧进一步分解为表达式(即附加产生式规则)、标记或两者。
antlr4 中的侦听器是一个合适的地方,您可以在其中拦截适当解析器规则的结果。在此示例中,您将设置一个在侦听器回调中设置 startTime
和 endTime
的侦听器——然后在树遍历完成后,根据需要使用这些值。