]> gitweb.ps.run Git - toc/blob - antlr4-cpp-runtime-4.9.2-source/runtime/src/tree/pattern/ParseTreeMatch.cpp
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / runtime / src / tree / pattern / ParseTreeMatch.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 "Exceptions.h"
7
8 #include "tree/pattern/ParseTreeMatch.h"
9
10 using namespace antlr4::tree;
11 using namespace antlr4::tree::pattern;
12
13 ParseTreeMatch::ParseTreeMatch(ParseTree *tree, const ParseTreePattern &pattern,
14                                const std::map<std::string, std::vector<ParseTree *>> &labels,
15                                ParseTree *mismatchedNode)
16   : _tree(tree), _pattern(pattern), _labels(labels), _mismatchedNode(mismatchedNode) {
17   if (tree == nullptr) {
18     throw IllegalArgumentException("tree cannot be nul");
19   }
20 }
21
22 ParseTreeMatch::~ParseTreeMatch() {
23 }
24
25 ParseTree* ParseTreeMatch::get(const std::string &label) {
26   auto iterator = _labels.find(label);
27   if (iterator == _labels.end() || iterator->second.empty()) {
28     return nullptr;
29   }
30
31   return iterator->second.back(); // return last if multiple
32 }
33
34 std::vector<ParseTree *> ParseTreeMatch::getAll(const std::string &label) {
35   auto iterator = _labels.find(label);
36   if (iterator == _labels.end()) {
37     return {};
38   }
39
40   return iterator->second;
41 }
42
43 std::map<std::string, std::vector<ParseTree *>>& ParseTreeMatch::getLabels() {
44   return _labels;
45 }
46
47 ParseTree *ParseTreeMatch::getMismatchedNode() {
48   return _mismatchedNode;
49 }
50
51 bool ParseTreeMatch::succeeded() {
52   return _mismatchedNode == nullptr;
53 }
54
55 const ParseTreePattern& ParseTreeMatch::getPattern() {
56   return _pattern;
57 }
58
59 ParseTree * ParseTreeMatch::getTree() {
60   return _tree;
61 }
62
63 std::string ParseTreeMatch::toString() {
64   if (succeeded()) {
65     return "Match succeeded; found " + std::to_string(_labels.size()) + " labels";
66   } else {
67     return "Match failed; found " + std::to_string(_labels.size()) + " labels";
68   }
69 }