ANTLR4 - 一种 skip/stop 调用事件的方法,直至另行通知

ANTLR4 - A way to skip/stop invokeing events until further notice

有没有办法通知监听器停止调用事件,直到另行通知?

例如:

让我们假设一个监听器用于像 SQL SELECT 这样的循环结构。

“SELECT * FROM TABLE_B b WHERE b.id IN (SELECT a.ID FROM TABLE_A a WHERE a.ID = 10 )”

现在我想将 sub-select 发送给辅助侦听器,但没有主侦听器处理 sub-select 标记?

行中的内容:

void SQLLISTENER::enterSubSelect (SQLParser::SubSelectContext *ctx) override { 
          
         stopProcessingToken() ; //Stop processing main listener 
          SQLLISTENER * listener = new SQLLISTENER ();
          antlr4::tree::ParseTreeWalker::DEFAULT.walk(listener, ctx);

}
void SQLLISTENER::exitSubSelect(SQLParser::SubSelectContext *ctx) override {

        StartProcessingToken(); //Resume processing main listener 
}

  1. ANTLR 是否支持这种类型的跳过标记?
  2. 是否有更优雅的方法来实现递归部分的处理?

对于解析树中的所有节点,侦听器总是同时触发 enter- 和 exit-events。您确实可以跟踪某个 enter 规则被调用了多少次,并将您的逻辑基于此。但是,当规则数量变大时(以及因此而增加的检查数量),这将变得很麻烦。

在您的情况下,使用访问者可能更好:对于访问者,您可以决定何时希望它潜入某个(子)树。当您决定不进入(子)树时,它将被完全跳过。