Pythonを応用して書いた簡単なClassコードジェネレータ

6252 ワード

通常、C++クラスやデータ構造を書くのに苦労している場合、各クラスにはクラスに関連する構造、構造関数が4、5個必要です.クラス名と変数名を繰り返すたびに、時間がかかります.これらの関数を省略すると、コードスタイルが悪く、安全ではありません.
クラス名、変数、関数を定義するだけで、比較的完璧なコードを生成できるコード生成ツールがよく見られます.フォーマットが統一され、きれいで安全です.しかし、これらのツールはすべて自分のフレームワークやコンパイルシステムに関連しており、汎用性はあまりよくありません.
最近pythonの応用を学びたいと思って、自分で簡単なClassコードジェネレータを書いてみました.一般的な考え方に従います:きれいで使いやすいインタフェースを設計して、タイプ定義のxmlあるいはその他のフォーマットのデータファイルを生成して、それからコードに翻訳します.この仕事量と複雑なプログラムの設計は私のpython初心者にとって短時間では不可能です.2/8の原則に従って、最も簡単で使いやすいインターフェースを設計して、できるだけいくつかの繰り返し性の労働を完成します.
必要なツールの使用方法:
declareなどのテキストファイルでのみ使用できます.txtでは、最初の行がクラス名に書き込まれ、次の行ごとにタイプ名と変数名が書き込まれます.
生成されたコードには、クラスの宣言と様々な構造と構造関数が含まれます.
例えば:declare.txtファイル内
Test   int a float b string c
生成するターゲットコード:
class Test
{
    Test();
    Test(int _a, float _b, const string &_c);
    Test(const Test &rhs);
    Test& operator = (const Test &rhs);
    ~Test();

public: // private:
    int a; 
    float b; 
    string c;
};


Test::Test()
: a()
, b()
, c()
{
}

Test::Test(int _a, float _b, const string &_c)
: a(_a)
, b(_b)
, c(_c)
{
}

Test::Test(const Test &rhs)
{
	*this = rhs;
}

Test& Test::operator = (const Test &rhs)
{
	if (&rhs != this)
	{
        	a = rhs.a; 
        	b = rhs.b; 
        	c = rhs.c;
	}

	return *this;
}

Test::~Test()
{
}

設計構想:
入力方式が確定し、出力結果のフォーマットも確定します.まず、クラスのフォーマットなど、結果に変わらないものを抽出し、テンプレートを作成します.
class ClassName
{
    ClassName();
    ClassName(ConstructorParameterList);
    ClassName(const ClassName &rhs);
    ClassName& operator = (const ClassName &rhs);
    ~ClassName();

public: // private:
    VariableList
};


ClassName::ClassName()
: DefaultInitializationList
{
}

ClassName::ClassName(ConstructorParameterList)
: ParameterInitializationList
{
}

ClassName::ClassName(const ClassName &rhs)
{
	*this = rhs;
}

ClassName& ClassName::operator = (const ClassName &rhs)
{
	if (&rhs != this)
	{
        AssignmentList
	}

	return *this;
}

ClassName::~ClassName()
{
}

そして、ClassNameを定義されたクラス名に置き換え、定義された変数を変数宣言リスト、コンストラクション関数パラメータリスト、付与関数リストに組み合わせ、VariableList、DefaultInitializationList、ConstructorParameterList、ParameterInitializationList、AssignmentListを置き換えるだけです.
Pythonコードは、いくつかの文字列の組み合わせ、置換などを完了するだけです.
import sys                       # Load the sys module (  sys  )
import string

def ReplaceStrings(stringlist, fromString, toString):
    for i in range(0, len(stringlist)):
        s = stringlist[i]
        s = string.replace(s, fromString, toString); 
        stringlist[i] = s
        #print stringlist[i]

f = open("template.txt")            # template.txt
templateTextLines = f.readlines()          # Read all lines into a list (          )
f.close()

f = open('declare.txt')#(sys.argv[1])            # Filename on the command line (         )
declareLines = f.readlines()          # Read all lines into a list (          ), strip all space and 
f.close() typeString = "" nameString = "" variableListstring = "" constructorParameterListString = "" defaultInitialListString = "" parameterListString = "" assignmentListString = "" for i in range(1, len(declareLines)): lineString = declareLines[i] lineString = lineString.lstrip() lineString = lineString.rstrip() lineString = lineString.rstrip("
") if lineString == "": # continue splittedStrings = lineString.split() if len(splittedStrings) > 1: # , : unsigned int typeString = splittedStrings[0] nameString = splittedStrings[1] variableListstring += lineString + ";
" if typeString=="int" or typeString=="float" or typeString=="double" or typeString=="UInt32" or typeString=="Int32" or typeString == "Float32": # constructorParameterListString += typeString + " _" + nameString + ", " # , else: constructorParameterListString += "const " + typeString + " &_" + nameString + ", " # , defaultInitialListString += nameString + "()
, " parameterListString += nameString + "(_" + nameString + ")
, " assignmentListString += nameString + " = rhs." + nameString + ";
" variableListstring = variableListstring.rstrip("
") # constructorParameterListString = constructorParameterListString.rstrip(", ") defaultInitialListString = defaultInitialListString.rstrip("
, ") parameterListString = parameterListString.rstrip("
, ") assignmentListString = assignmentListString.rstrip("
") ReplaceStrings(templateTextLines, "ClassName", declareLines[0].strip("
").strip()) ReplaceStrings(templateTextLines, "VariableList", variableListstring) ReplaceStrings(templateTextLines, "DefaultInitializationList", defaultInitialListString) ReplaceStrings(templateTextLines, "ConstructorParameterList", constructorParameterListString) ReplaceStrings(templateTextLines, "ParameterInitializationList", parameterListString) ReplaceStrings(templateTextLines, "AssignmentList", assignmentListString) f = open("out.txt","w") # Open file for writing for s in templateTextLines: f.write(s) # print s f.close()

1日勉強しながら書いて、機能が完備していないので、関数を追加することはできません.変数タイプ宣言は現在1つの文字列しかありません.コードにはスタイルと構造がありません.ただし、使いやすく、後の機能はゆっくり追加できます.
また、pythonの基本文法を学びました
pythonの使用はc++と明らかに異なります.
1.用:{}の代わりにインデント
2.変数のタイプを定義する必要はありません
3.ない&&,|,!and,or,not
4.キーワードはすべて小文字
5.関数パラメータとしてstring、tuples、numbersなどの基本タイプは、値を伝達する方法であり、関数内の変更は無効である.メタグループ、リストの内容は、ポインタや参照のように変更できます.
参照先:http://blog.csdn.net/winterttr/article/details/2590741
6.string関数は、自身を変更することなく、実行または変更の結果を返します.自身を変更する場合は、結果を受信する必要があります.
variableListstring = variableListstring.rstrip("")#余分な末尾記号を削除
7.後続
pythonのWebサイトを学ぶ:http://wiki.woodpecker.org.cn/moin/WeiZhong/2006-01-17