]> gitweb.ps.run Git - toc/blob - antlr4-cpp-runtime-4.9.2-source/runtime/src/tree/ParseTreeWalker.cpp
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / runtime / src / tree / ParseTreeWalker.cpp
1 /* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
2  * Use of this file is governed by the BSD 3-clause license that
3  * can be found in the LICENSE.txt file in the project root.
4  */
5
6 #include "tree/ErrorNode.h"
7 #include "ParserRuleContext.h"
8 #include "tree/ParseTreeListener.h"
9 #include "support/CPPUtils.h"
10
11 #include "tree/IterativeParseTreeWalker.h"
12 #include "tree/ParseTreeWalker.h"
13
14 using namespace antlr4::tree;
15 using namespace antlrcpp;
16
17 static IterativeParseTreeWalker defaultWalker;
18 ParseTreeWalker &ParseTreeWalker::DEFAULT = defaultWalker;
19
20 ParseTreeWalker::~ParseTreeWalker() {
21 }
22
23 void ParseTreeWalker::walk(ParseTreeListener *listener, ParseTree *t) const {
24   if (is<ErrorNode *>(t)) {
25     listener->visitErrorNode(dynamic_cast<ErrorNode *>(t));
26     return;
27   } else if (is<TerminalNode *>(t)) {
28     listener->visitTerminal(dynamic_cast<TerminalNode *>(t));
29     return;
30   }
31
32   enterRule(listener, t);
33   for (auto &child : t->children) {
34     walk(listener, child);
35   }
36   exitRule(listener, t);
37 }
38
39 void ParseTreeWalker::enterRule(ParseTreeListener *listener, ParseTree *r) const {
40   ParserRuleContext *ctx = dynamic_cast<ParserRuleContext *>(r);
41   listener->enterEveryRule(ctx);
42   ctx->enterRule(listener);
43 }
44
45 void ParseTreeWalker::exitRule(ParseTreeListener *listener, ParseTree *r) const {
46   ParserRuleContext *ctx = dynamic_cast<ParserRuleContext *>(r);
47   ctx->exitRule(listener);
48   listener->exitEveryRule(ctx);
49 }