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
}
- ANTLR 是否支持这种类型的跳过标记?
- 是否有更优雅的方法来实现递归部分的处理?
对于解析树中的所有节点,侦听器总是同时触发 enter- 和 exit-events。您确实可以跟踪某个 enter
规则被调用了多少次,并将您的逻辑基于此。但是,当规则数量变大时(以及因此而增加的检查数量),这将变得很麻烦。
在您的情况下,使用访问者可能更好:对于访问者,您可以决定何时希望它潜入某个(子)树。当您决定不进入(子)树时,它将被完全跳过。
有没有办法通知监听器停止调用事件,直到另行通知?
例如:
让我们假设一个监听器用于像 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
}
- ANTLR 是否支持这种类型的跳过标记?
- 是否有更优雅的方法来实现递归部分的处理?
对于解析树中的所有节点,侦听器总是同时触发 enter- 和 exit-events。您确实可以跟踪某个 enter
规则被调用了多少次,并将您的逻辑基于此。但是,当规则数量变大时(以及因此而增加的检查数量),这将变得很麻烦。
在您的情况下,使用访问者可能更好:对于访问者,您可以决定何时希望它潜入某个(子)树。当您决定不进入(子)树时,它将被完全跳过。