summaryrefslogtreecommitdiff
path: root/generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'generator.py')
-rw-r--r--generator.py208
1 files changed, 208 insertions, 0 deletions
diff --git a/generator.py b/generator.py
new file mode 100644
index 0000000..16407b4
--- /dev/null
+++ b/generator.py
@@ -0,0 +1,208 @@
+import re, os, shutil, string, sys
+
+def generateElements(elementFiles, outputCpp, outputH):
+
+ elementClasses = dict()
+ baseClasses = dict()
+
+ elementHeader = """#ifndef ELEMENTCLASSES_H
+#define ELEMENTCLASSES_H
+
+#include <vector>
+
+#include "simulation/Element.h"
+#include "simulation/elements/Element.h"
+
+"""
+
+ directives = []
+
+ for elementFile in elementFiles:
+ f = open(elementFile, "r")
+ fileData = f.read()
+ f.close()
+
+ directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
+ matcher = re.compile(directiveMatcher)
+ directiveMatches = matcher.findall(fileData)
+
+ for match in directiveMatches:
+ directives.append(match.split(" "))
+
+ classDirectives = []
+ for d in directives:
+ if d[0] == "ElementClass":
+ d[3] = string.atoi(d[3])
+ classDirectives.append(d)
+
+ elementIDs = sorted(classDirectives, key=lambda directive: directive[3])
+
+ for d in elementIDs:
+ tmpClass = d[1]
+ newClass = ""
+ baseClass = "Element"
+ if ':' in tmpClass:
+ classBits = tmpClass.split(':')
+ newClass = classBits[0]
+ baseClass = classBits[1]
+ else:
+ newClass = tmpClass
+
+ elementClasses[newClass] = []
+ baseClasses[newClass] = baseClass
+ elementHeader += "#define %s %s\n" % (d[2], d[3])
+
+ for d in directives:
+ if d[0] == "ElementHeader":
+ tmpClass = d[1]
+ newClass = ""
+ baseClass = "Element"
+ if ':' in tmpClass:
+ classBits = tmpClass.split(':')
+ newClass = classBits[0]
+ baseClass = classBits[1]
+ else:
+ newClass = tmpClass
+ elementClasses[newClass].append(string.join(d[2:], " ")+";")
+
+ #for className, classMembers in elementClasses.items():
+ for d in elementIDs:
+ tmpClass = d[1]
+ newClass = ""
+ baseClass = "Element"
+ if ':' in tmpClass:
+ classBits = tmpClass.split(':')
+ newClass = classBits[0]
+ baseClass = classBits[1]
+ else:
+ newClass = tmpClass
+
+ className = newClass
+ classMembers = elementClasses[newClass]
+ elementBase = baseClass
+ elementHeader += """
+class {0}: public {1}
+{{
+public:
+ {0}();
+ virtual ~{0}();
+ {2}
+}};
+ """.format(className, elementBase, string.join(classMembers, "\n\t"))
+
+ elementHeader += """
+std::vector<Element> GetElements();
+
+#endif
+ """
+
+ elementContent = """#include "ElementClasses.h"
+
+std::vector<Element> GetElements()
+{
+ std::vector<Element> elements;
+ """;
+
+ for d in elementIDs:
+ tmpClass = d[1]
+ newClass = ""
+ baseClass = "Element"
+ if ':' in tmpClass:
+ classBits = tmpClass.split(':')
+ newClass = classBits[0]
+ baseClass = classBits[1]
+ else:
+ newClass = tmpClass
+ elementContent += """elements.push_back(%s());
+ """ % (newClass)
+
+ elementContent += """ return elements;
+}
+ """;
+
+ f = open(outputH, "w")
+ f.write(elementHeader)
+ f.close()
+
+ f = open(outputCpp, "w")
+ f.write(elementContent)
+ f.close()
+
+def generateTools(toolFiles, outputCpp, outputH):
+ toolClasses = dict()
+
+ toolHeader = """#ifndef TOOLCLASSES_H
+ #define TOOLCLASSES_H
+ #include <vector>
+ #include "simulation/Tools.h"
+ #include "simulation/tools/SimTool.h"
+ """
+
+ directives = []
+
+ for toolFile in toolFiles:
+ f = open(toolFile, "r")
+ fileData = f.read()
+ f.close()
+
+ directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
+ matcher = re.compile(directiveMatcher)
+ directiveMatches = matcher.findall(fileData)
+
+ for match in directiveMatches:
+ directives.append(match.split(" "))
+
+ classDirectives = []
+ for d in directives:
+ if d[0] == "ToolClass":
+ toolClasses[d[1]] = []
+ toolHeader += "#define %s %s\n" % (d[2], d[3])
+ d[3] = string.atoi(d[3])
+ classDirectives.append(d)
+
+ for d in directives:
+ if d[0] == "ToolHeader":
+ toolClasses[d[1]].append(string.join(d[2:], " ")+";")
+
+ for className, classMembers in toolClasses.items():
+ toolHeader += """class {0}: public SimTool
+ {{
+ public:
+ {0}();
+ virtual ~{0}();
+ virtual int Perform(Simulation * sim, Particle * cpart, int x, int y, float strength);
+ {1}
+ }};
+ """.format(className, string.join(classMembers, "\n"))
+
+ toolHeader += """std::vector<SimTool*> GetTools();
+ #endif
+ """
+
+ toolContent = """#include "ToolClasses.h"
+ std::vector<SimTool*> GetTools()
+ {
+ std::vector<SimTool*> tools;
+ """;
+
+ toolIDs = sorted(classDirectives, key=lambda directive: directive[3])
+ for d in toolIDs:
+ toolContent += """ tools.push_back(new %s());
+ """ % (d[1])
+
+ toolContent += """ return tools;
+ }
+ """;
+
+ f = open(outputH, "w")
+ f.write(toolHeader)
+ f.close()
+
+ f = open(outputCpp, "w")
+ f.write(toolContent)
+ f.close()
+
+if(sys.argv[1] == "elements"):
+ generateElements(sys.argv[4:], sys.argv[2], sys.argv[3])
+elif(sys.argv[1] == "tools"):
+ generateTools(sys.argv[4:], sys.argv[2], sys.argv[3])