]> gitweb.ps.run Git - toc/blobdiff - antlr4-cpp-runtime-4.9.2-source/runtime/src/tree/ParseTreeProperty.h
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / runtime / src / tree / ParseTreeProperty.h
diff --git a/antlr4-cpp-runtime-4.9.2-source/runtime/src/tree/ParseTreeProperty.h b/antlr4-cpp-runtime-4.9.2-source/runtime/src/tree/ParseTreeProperty.h
new file mode 100644 (file)
index 0000000..8669a10
--- /dev/null
@@ -0,0 +1,50 @@
+/* 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 {
+
+  /// <summary>
+  /// Associate a property with a parse tree node. Useful with parse tree listeners
+  /// that need to associate values with particular tree nodes, kind of like
+  /// specifying a return value for the listener event method that visited a
+  /// particular node. Example:
+  ///
+  /// <pre>
+  /// ParseTreeProperty&lt;Integer&gt; values = new ParseTreeProperty&lt;Integer&gt;();
+  /// values.put(tree, 36);
+  /// int x = values.get(tree);
+  /// values.removeFrom(tree);
+  /// </pre>
+  ///
+  /// You would make one decl (values here) in the listener and use lots of times
+  /// in your event methods.
+  /// </summary>
+  template<typename V>
+  class ANTLR4CPP_PUBLIC ParseTreeProperty {
+  public:
+    virtual ~ParseTreeProperty() {}
+    virtual V get(ParseTree *node) {
+      return _annotations[node];
+    }
+    virtual void put(ParseTree *node, V value) {
+      _annotations[node] = value;
+    }
+    virtual V removeFrom(ParseTree *node) {
+      auto value = _annotations[node];
+      _annotations.erase(node);
+      return value;
+    }
+
+  protected:
+    std::map<ParseTree*, V> _annotations;
+  };
+
+} // namespace tree
+} // namespace antlr4