/*
* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
* Use of this file is governed by the BSD 3-clause license that
* can be found in the LICENSE.txt file in the project root.
*/
package org.antlr.v4.runtime.tree;
import org.antlr.v4.runtime.ParserRuleContext;
public class ParseTreeWalker {
public static final ParseTreeWalker DEFAULT = new ParseTreeWalker();
Performs a walk on the given parse tree starting at the root and going down recursively with depth-first search. On each node, enterRule
is called before recursively walking down into child nodes, then exitRule
is called after the recursive call to wind up. Params: - listener – The listener used by the walker to process grammar rules
- t – The parse tree to be walked on
/**
* Performs a walk on the given parse tree starting at the root and going down recursively
* with depth-first search. On each node, {@link ParseTreeWalker#enterRule} is called before
* recursively walking down into child nodes, then
* {@link ParseTreeWalker#exitRule} is called after the recursive call to wind up.
* @param listener The listener used by the walker to process grammar rules
* @param t The parse tree to be walked on
*/
public void walk(ParseTreeListener listener, ParseTree t) {
if ( t instanceof ErrorNode) {
listener.visitErrorNode((ErrorNode)t);
return;
}
else if ( t instanceof TerminalNode) {
listener.visitTerminal((TerminalNode)t);
return;
}
RuleNode r = (RuleNode)t;
enterRule(listener, r);
int n = r.getChildCount();
for (int i = 0; i<n; i++) {
walk(listener, r.getChild(i));
}
exitRule(listener, r);
}
Enters a grammar rule by first triggering the generic event ParseTreeListener.enterEveryRule
then by triggering the event specific to the given parse tree node Params: - listener – The listener responding to the trigger events
- r – The grammar rule containing the rule context
/**
* Enters a grammar rule by first triggering the generic event {@link ParseTreeListener#enterEveryRule}
* then by triggering the event specific to the given parse tree node
* @param listener The listener responding to the trigger events
* @param r The grammar rule containing the rule context
*/
protected void enterRule(ParseTreeListener listener, RuleNode r) {
ParserRuleContext ctx = (ParserRuleContext)r.getRuleContext();
listener.enterEveryRule(ctx);
ctx.enterRule(listener);
}
Exits a grammar rule by first triggering the event specific to the given parse tree node then by triggering the generic event ParseTreeListener.exitEveryRule
Params: - listener – The listener responding to the trigger events
- r – The grammar rule containing the rule context
/**
* Exits a grammar rule by first triggering the event specific to the given parse tree node
* then by triggering the generic event {@link ParseTreeListener#exitEveryRule}
* @param listener The listener responding to the trigger events
* @param r The grammar rule containing the rule context
*/
protected void exitRule(ParseTreeListener listener, RuleNode r) {
ParserRuleContext ctx = (ParserRuleContext)r.getRuleContext();
ctx.exitRule(listener);
listener.exitEveryRule(ctx);
}
}