SyntaxHighlighter

StackEdit CSS

2013年1月30日水曜日

C++のヘッダをUmletのプロパティに変換する

学校の課題で、クラス図を書く用があったのが、もうソースコードは書き終わっていて、ヘッダから書き移すのもアレだったので、変換プログラムを書いた。perlで書きたかったんだけど、windowsで環境が入ってなかったので、JScriptで。あと、正しいソース前提。

function join(c){
    var ret = new Array();
    for(var i = 1;i < arguments.length;i++){
        ret.push(arguments[i]);
    }
    return ret.join(c);
}

var args = WScript.Arguments;

if(args.length < 1){
    WScript.Echo("Error!");
    WScript.Quit();
}

var FS = new ActiveXObject("Scripting.FileSystemObject");

//  オープンモード
var FORREADING      = 1;    // 読み取り専用
var FORWRITING      = 2;    // 書き込み専用
var FORAPPENDING    = 8;    // 追加書き込み

//  開くファイルの形式
var TRISTATE_TRUE       = -1;   // Unicode
var TRISTATE_FALSE      =  0;   // ASCII
var TRISTATE_USEDEFAULT = -2;   // システムデフォルト

for(var arg_index = 0;arg_index < args.length;arg_index++){
    var fname = args(arg_index);
    
    var infile = FS.OpenTextFile(fname, FORREADING, false, TRISTATE_FALSE);
    
    var outfile = FS.OpenTextFile(fname + "_out.txt", FORWRITING, true, TRISTATE_FALSE);
    
    var visibility = "-";
    
    var classname = "";
    var fields = new Array();
    var methods = new Array();
    
    while(!infile.AtEndOfStream){
        
        var line = infile.ReadLine();
        
        var fixes = {"virtual " : "/", "static " : "_", "" : ""};
        
        var tokens;
        if(tokens = line.match(/class (\w+)/)){
            classname = tokens[1];
        }
        //private
        else if(line.indexOf("private:") != -1){
            visibility = "-";
        }
        //public
        else if(line.indexOf("public:") != -1){
            visibility = "+";
        }
        //protected
        else if(line.indexOf("protected:") != -1){
            visibility = "#";
        }
        //method
        else if(tokens = line.match(/(virtual |static |)(\w+) (\w+)\(([\w, ]*)\);/)){
            
            var fix = fixes[tokens[1]];
            
            var ret_type = tokens[2];
            
            var name = tokens[3];
            
            var arg = tokens[4].replace(/(\w+) (\w+)/g, function($1, $2, $3){ return $3 + " : " + $2; });
            
            var s = join(" ", fix, visibility, name + "(" + arg + ")", ":", ret_type, fix);
            methods.push(s);
        }
        //field
        else if(tokens = line.match(/(|static |)(\w+) (\w+);/)){
            
            var fix = fixes[tokens[1]];
            
            var type = tokens[2];
            
            var name = tokens[3];
            
            var s = join(" ", fix, visibility, name, ":", type, fix);
            fields.push(s);
        }
        else{
            //WScript.Echo("no matches");
        }
        
    }
    
    outfile.WriteLine(classname);
    if(fields.length > 0) outfile.WriteLine("--");
    for(var i = 0;i < fields.length;i++) outfile.WriteLine(fields[i]);
    if(methods.length > 0) outfile.WriteLine("--");
    for(var i = 0;i < methods.length;i++) outfile.WriteLine(methods[i]);
    
    infile.Close();
    infile = null;
    
    outfile.Close();
    outfile = null;

}

WScript.Echo("finish");

手で書き写した方が速いとわかってたがプログラムの練習のために…
他の人も使ってくれるみたいだし。

0 件のコメント:

コメントを投稿