/* 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.
 */

#pragma once

#include "antlr4-common.h"

namespace antlr4 {
namespace tree {

class ANTLR4CPP_PUBLIC ParseTreeWalker {
public:
    static ParseTreeWalker& DEFAULT;

    virtual ~ParseTreeWalker();

    /**
     * <summary>
     * Performs a walk on the given parse tree starting at the root and going down recursively
     * with depth-first search. On each node, <seealso cref="ParseTreeWalker#enterRule"/> is called
     * before recursively walking down into child nodes, then <seealso
     * cref="ParseTreeWalker#exitRule"/> is called after the recursive call to wind up.
     * </summary>
     * <param name='listener'> The listener used by the walker to process grammar rules </param>
     * <param name='t'> The parse tree to be walked on </param>
     */
    virtual void walk(ParseTreeListener* listener, ParseTree* t) const;

protected:
    /**
     * <summary>
     * Enters a grammar rule by first triggering the generic event <seealso
     * cref="ParseTreeListener#enterEveryRule"/> then by triggering the event specific to the given
     * parse tree node
     * </summary>
     * <param name='listener'> The listener responding to the trigger events </param>
     * <param name='r'> The grammar rule containing the rule context </param>
     */
    virtual void enterRule(ParseTreeListener* listener, ParseTree* r) const;

    /**
     * <summary>
     * Exits a grammar rule by first triggering the event specific to the given parse tree node
     * then by triggering the generic event <seealso cref="ParseTreeListener#exitEveryRule"/>
     * </summary>
     * <param name='listener'> The listener responding to the trigger events </param>
     * <param name='r'> The grammar rule containing the rule context </param>
     */
    virtual void exitRule(ParseTreeListener* listener, ParseTree* r) const;
};

} // namespace tree
} // namespace antlr4
