summaryrefslogtreecommitdiff
path: root/scripts/addfile.py
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-06 21:15:59 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-06 21:15:59 +0300
commit2f24687e069abfc82383171d4e05d06487f69a06 (patch)
treedf8954b218b8ccc44dbc52295f86f0ea191883d9 /scripts/addfile.py
parent51096a574a96d741fe875d5bd954f9fea382aacb (diff)
downloadparanucker-2f24687e069abfc82383171d4e05d06487f69a06.tar.gz
paranucker-2f24687e069abfc82383171d4e05d06487f69a06.tar.bz2
paranucker-2f24687e069abfc82383171d4e05d06487f69a06.tar.xz
paranucker-2f24687e069abfc82383171d4e05d06487f69a06.zip
Add script for autogenerate node and parsers based on dir and name.
Diffstat (limited to 'scripts/addfile.py')
-rwxr-xr-xscripts/addfile.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/scripts/addfile.py b/scripts/addfile.py
new file mode 100755
index 0000000..ab1b937
--- /dev/null
+++ b/scripts/addfile.py
@@ -0,0 +1,80 @@
+#! /usr/bin/env python2
+# -*- coding: utf8 -*-
+#
+# Copyright (C) 2015 Andrei Karas
+
+import sys
+
+
+def readFile(path):
+ with open(path, "r") as f:
+ return f.read()
+def writeFile(fileName, data):
+ with open(fileName, "w") as w:
+ w.write(data)
+def firstBigLetter(text):
+ return text[0].upper() + text[1:]
+
+
+if len(sys.argv) < 2 or len(sys.argv) > 3:
+ print "Usage:"
+ print " addfile.py [dir] nodename"
+ exit(1)
+
+nodeTemplate = readFile("tpl/node.tpl")
+parserTemplate = readFile("tpl/parser.tpl")
+if len(sys.argv) == 2:
+ dirName = ""
+ nodeName = sys.argv[1].lower()
+else:
+ dirName = sys.argv[1].lower()
+ nodeName = sys.argv[2].lower()
+suffixSize = 0
+parserAdditionalCode1 = ""
+parserAdditionalCode2 = ""
+parserBaseInclude = ""
+
+if nodeName[-4:] == "decl":
+ suffixSize = 4
+ parserAdditionalCode1 = " fillLocation(node);\n fillDeclLabel(node);\n"
+ parserAdditionalCode2 = "\n fillDeclAutoGenerated(node);\n fillDeclAttributes(node);\n"
+ parserBaseInclude = "#include \"parsers/base/decl.h\"\n"
+elif nodeName[-4:] == "type":
+ suffixSize = 4
+ parserAdditionalCode2 = "\n fillTypeName(node);\n fillTypeAttributes(node);\n"
+ parserBaseInclude = "#include \"parsers/base/type.h\"\n"
+elif nodeName[-3:] == "cst":
+ suffixSize = 3
+elif nodeName[-4:] == "expr":
+ suffixSize = 4
+ parserAdditionalCode2 = "\n fillExprOperands(node);\n"
+ parserBaseInclude = "#include \"parsers/base/expr.h\"\n"
+elif nodeName[-4:] == "list":
+ suffixSize = 4
+else:
+ print "unknown nodename"
+ exit(1)
+
+word1 = nodeName[0 : len(nodeName) - suffixSize]
+word2 = nodeName[- suffixSize:]
+typeName = firstBigLetter(word1) + firstBigLetter(word2)
+fileName = word1 + "_" + word2
+nodeInclude = ""
+if dirName != "":
+ guardHeader = (dirName + "_" + nodeName).upper()
+ baseName = dirName
+ baseTypeName = firstBigLetter(dirName)
+ nodeInclude = dirName + "/" + fileName
+else:
+ guardHeader = nodeName.upper()
+ baseName = "node"
+ baseTypeName = "Node"
+ nodeInclude = fileName
+
+writeFile("../src/nodes/{0}/{1}.h".format(dirName, fileName),
+ nodeTemplate.format(guardHeader, baseName, typeName, baseTypeName))
+writeFile("../src/parsers/{0}/{1}.cpp".format(dirName, fileName),
+ parserTemplate.format(typeName, nodeInclude, parserBaseInclude, parserAdditionalCode1, parserAdditionalCode2))
+
+#print nodeTemplate.format(guardHeader, baseName, typeName, baseTypeName)
+#print parserTemplate.format(typeName, nodeInclude, parserBaseInclude, parserAdditionalCode1, parserAdditionalCode2)