#! /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 = "" typeName = sys.argv[1] nodeName = typeName.lower() else: dirName = sys.argv[1].lower() typeName = sys.argv[2] nodeName = typeName.lower() suffixSize = 0 parserAdditionalCode1 = "" parserAdditionalCode2 = "" parserBaseInclude = "" if dirName != "": 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) else: suffixSize = 0 word1 = nodeName[0 : len(nodeName) - suffixSize] word2 = nodeName[- suffixSize:] nodeInclude = "" if dirName != "": fileName = word1 + "_" + word2 guardHeader = (dirName + "_" + nodeName).upper() baseName = dirName baseTypeName = firstBigLetter(dirName) nodeInclude = dirName + "/" + fileName nodeFileName = "../src/nodes/{0}/{1}.h".format(dirName, fileName) parserFileName = "../src/parsers/{0}/{1}.cpp".format(dirName, fileName) else: fileName = word1 guardHeader = nodeName.upper() baseName = "node" baseTypeName = "" nodeInclude = fileName nodeFileName = "../src/nodes/{0}.h".format(fileName) parserFileName = "../src/parsers/{0}.cpp".format(fileName) writeFile(nodeFileName, nodeTemplate.format(guardHeader, baseName, typeName, baseTypeName)) writeFile(parserFileName, parserTemplate.format(typeName, nodeInclude, parserBaseInclude, parserAdditionalCode1, parserAdditionalCode2))