Skip to content

Instantly share code, notes, and snippets.

@sharwell
Created December 12, 2012 02:17
Show Gist options
  • Save sharwell/4264307 to your computer and use it in GitHub Desktop.
Save sharwell/4264307 to your computer and use it in GitHub Desktop.
Extending an ANTLR 4 visitor class to allow "hooking" execution with a ParseTreeListener
// the main visitor implementation
class FooVisitor extends SomeBaseVisitor<T> {
}
// extend the visitor with hooks for a listener
class FooListenerVisitor extends FooVisitor {
private ParseTreeListener listener;
public FooListenerVisitor(ParseTreeListener listener) {
this.listener = listener;
}
@Override
public T visit(ParseTree tree) {
try {
if (listener != null) {
if (tree instanceof ParserRuleContext) {
((ParserRuleContext)tree).enterRule(listener);
}
else if (tree instanceof ErrorNode) {
listener.visitErrorNode((ErrorNode)tree);
}
else if (tree instanceof TerminalNode) {
listener.visitTerminal((TerminalNode)tree);
}
}
return super.visit(tree);
}
finally {
if (listener != null) {
if (tree instanceof ParserRuleContext) {
((ParserRuleContext)tree).exitRule(listener);
}
}
}
}
@Override
public T visitChildren(RuleNode node) {
// do whatever here
return super.visitChildren(node);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment