summaryrefslogblamecommitdiff
path: root/scripts/addfile.py
blob: ab1b9373399b6484f863eda6327b6e3000b2d81d (plain) (tree)















































































                                                                                                                    
#! /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)