chanting an air of joyous bliss

普段の生活で見逃しがちな面白いことを書いていく
そんなブログです

Javaのthrows句を抽出する

2007-02-22 12:15:47 | コンピュータ・プログラミング
昨日のエントリーの続き
今回はthrows句で定義される例外も抽出できるようにした
function pareseJavaSource(str){
    //parese用の文字列
    var parseStr = str;
    //連結用文字列
    var concatStr="";
    //文字列の切り出し位置
    var i = 0;
    //解析用のデータ構造
    var struct = new Array();
    //中括弧を格納する配列
    var parentheses = new Array();
    alert("開始");
    //メソッドシグニチャを解析する
    analysFunction(str.charAt(i));
    //引数を解析する
    analysArg(str.charAt(i));
    //例外を解析する
    analysThrow(str.charAt(i));
    //解析内容を出力
    debug();
    alert("終了");
    //引数を解析する
    function analysArg(strIn){
        if(strIn == "("){
            concatStr = "";
            struct["args"]=new Array();
        }else if(strIn == ")" || strIn == " "){
            var obj = struct["args"].pop();
            obj.value=concatStr.replace(/ |,/ig,"");
            struct["args"].push(obj);
            concatStr = "";
            if(strIn == ")"){
                i++;
                return;
            }
        }else if(strIn == ","){
            var obj = new Object();
            obj.type = concatStr;
            struct["args"].push(obj);
            concatStr=",";
        }else{
            concatStr +=strIn;
        }
        
        return analysArg(str.charAt(++i)); 
    }
    //メソッドシグニチャを解析する
    function analysFunction(strIn){
        if(i==0){
            struct["methodSign"] = new Array();
        }
        if(strIn == "("){
            concatStr = "";
            return;
        }else if (strIn == " "){
            if(concatStr != ""){
                struct["methodSign"].push(concatStr);
                concatStr = "";
            }
        }else{
            concatStr +=strIn;
        }
        analysFunction(str.charAt(++i));
        return 
    }
    //THORWS句を解析する
    function analysThrow(strIn){
        if(concatStr == "throws"){
            struct["throws"] = new Array();
            concatStr = "";
        }else if(strIn == "," || strIn == "{"){
            if(strIn == "{"){
                parentheses.push("start")
                return;
            }else{
                struct["throws"].push(concatStr);
            }
            concatStr = "";
        }else if(strIn == " "){
        }else{
            concatStr +=strIn;
        }
        analysThrow(str.charAt(++i));
        return;
    }
    //if文を解析する
    function analysIF(strIn){
        if(concatStr == "if"){
            var tem = parentheses.pop();
            if(tem == "IF"){
                var obj = searchObj(struct["IF"]);
                obj.next = new Object();
            }else{
                struct["IF"].push(new Object());
            }
            parentheses.push(tem);
            parentheses.push("IF")
            concatStr = "";
        }else if(strIn == ")"){
            obj = searchObj(struct["IF"]);
            obj.evaluate = (concatStr+")"); 
            concatStr = "";
        }else if("{"){
        }else if("}"){
            parentheses.pop();
            return;
        }else if(" "){
        }else{
            concatStr +=strIn;
        }    
    }
    
    //解析した内容を出力する
    function debug(){
        var array =  struct["args"];
        var str1="";
        for(var i in array){
            str1 += "型:" + array[i].type + " 変数名:" +  array[i].value + "\n";
        }
        array =  struct["methodSign"];
        for(var i in array){
            str1 += "メソッドジグニチャ" + i +":" + array[i] + "\n";
        }
        array =  struct["throws"];
        for(var i in array){
            str1 += "例外" + i +":" + array[i] + "\n";
        }
        alert(str1);
        alert(parentheses.length);
    }
}

ちょっとは再帰を使ったプログラミングに慣れてきたかな?

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« メソッドシグニチャと引数を... | トップ | 次の記事へ »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

コンピュータ・プログラミング」カテゴリの最新記事