aboutsummaryrefslogtreecommitdiff
path: root/core/trygvis
diff options
context:
space:
mode:
Diffstat (limited to 'core/trygvis')
-rw-r--r--core/trygvis/antlr.h67
-rw-r--r--core/trygvis/string_utils.h25
2 files changed, 92 insertions, 0 deletions
diff --git a/core/trygvis/antlr.h b/core/trygvis/antlr.h
new file mode 100644
index 0000000..f5656ea
--- /dev/null
+++ b/core/trygvis/antlr.h
@@ -0,0 +1,67 @@
+#pragma once
+
+#include "antlr4-runtime.h"
+
+namespace trygvis {
+namespace antlr {
+
+// This namespace is shared copied code
+
+using ParseTree = antlr4::tree::ParseTree;
+
+class MissingParseTreeProperty : public std::out_of_range {
+public:
+ explicit MissingParseTreeProperty(const std::string &what) : out_of_range(what) { }
+};
+
+template<typename V, bool debug = false>
+class ParseTreeProperty {
+public:
+ virtual V get(Ref<ParseTree> node) {
+ return get(node.get());
+ }
+
+ virtual V get(ParseTree *const node) {
+ if (!debug) {
+ return _annotations.at(node);
+ }
+
+ try {
+// cerr << "node = " << node->getText() << endl;
+ return _annotations.at(node);
+ } catch (std::out_of_range &e) {
+ std::cerr << "get(" << node << "), text=" << node->getText() << std::endl;
+ std::stringstream buf;
+ buf << "out of range: " << node << ", text=" << node->getText();
+ auto msg = buf.str();
+ std::cerr << msg << std::endl;
+ throw MissingParseTreeProperty(msg);
+ }
+ }
+
+ virtual void put(ParseTree *const node, V value) {
+ if (debug) {
+ std::cerr << "put(" << node << ", " << value << "), text: " << node->getText() << std::endl;
+ }
+ _annotations[node] = value;
+ }
+
+ virtual V removeFrom(ParseTree *const node) {
+ auto it = _annotations.find(node);
+
+ if (it == _annotations.end()) {
+ throw MissingParseTreeProperty(node->getText());
+ }
+
+ return it->second;
+ }
+
+protected:
+ std::map<ParseTree *, V> _annotations;
+
+private:
+};
+
+} // namespace antlr
+
+}
diff --git a/core/trygvis/string_utils.h b/core/trygvis/string_utils.h
new file mode 100644
index 0000000..2f2a7a5
--- /dev/null
+++ b/core/trygvis/string_utils.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <string>
+
+namespace trygvis {
+namespace string_utils {
+
+/**
+ * Check if a starts with b.
+ */
+__attribute__((unused))
+static bool startsWith(const std::string &a, const std::string &b) {
+ return b.length() <= a.length() && a.compare(0, b.length(), b) == 0;
+}
+
+/**
+ * Check if a ends with b.
+ */
+__attribute__((unused))
+static bool endsWith(const std::string &a, const std::string &b) {
+ return b.length() <= a.length() && a.compare(a.length() - b.length(), b.length(), b) == 0;
+}
+
+} // namespace string_utils
+} // namespace trygvis