add antlr
This commit is contained in:
50
lib/antlr4/include/tree/ParseTreeProperty.h
Normal file
50
lib/antlr4/include/tree/ParseTreeProperty.h
Normal file
@@ -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<Integer> values = new ParseTreeProperty<Integer>();
|
||||
/// 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
|
Reference in New Issue
Block a user