aboutsummaryrefslogtreecommitdiff
path: root/core/include-priv/trygvis/antlr.h
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2016-08-01 08:20:23 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2016-08-01 08:20:23 +0200
commitbfeeac6e4889d1e9a1083b3c7efc59652981b168 (patch)
treea937d844a59da7c509685dcd1ddd9933772e526f /core/include-priv/trygvis/antlr.h
parentc307e9f234e544386fa3ae53083c7510668e1716 (diff)
downloadkicad-utils-bfeeac6e4889d1e9a1083b3c7efc59652981b168.tar.gz
kicad-utils-bfeeac6e4889d1e9a1083b3c7efc59652981b168.tar.bz2
kicad-utils-bfeeac6e4889d1e9a1083b3c7efc59652981b168.tar.xz
kicad-utils-bfeeac6e4889d1e9a1083b3c7efc59652981b168.zip
o Moving the generation logic to Python, embedding a Python interpreter with the help of pybind11.
o Adding install configuration to CMake to make it easier to reuse the project later on. o Splitting out the examples into its own project to make it easier to test the whole installation setup and python/template loading. o Trying to reorganize the code a bit, not very much better yet.
Diffstat (limited to 'core/include-priv/trygvis/antlr.h')
-rw-r--r--core/include-priv/trygvis/antlr.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/core/include-priv/trygvis/antlr.h b/core/include-priv/trygvis/antlr.h
new file mode 100644
index 0000000..f5656ea
--- /dev/null
+++ b/core/include-priv/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
+
+}