作者:zyl910
一、背景
現在很多常用的UML工具不支援Objective-C,在繪製UML時很不方便。得手工將Objective-C文法的參數列表,轉為UML文法或C++文法。比較費力且容易出錯。
於是我想編寫一個工具,自動的將Objective-C文法的參數列錶轉為UML或C++文法。
用什麼語言開發呢?
為了跨平台,我決定採用JavaScript來編寫該工具。
現在只是一個字串分析與產生的小工具,JavaScript足以勝任。
二、功能設計
介面如下——
基本使用方法——
1. 在“源參數列表”填寫Objective-C方法的聲明;
2. 點擊“轉換”按鈕,UML與C++文字框出現轉換結果;
3. 將UML與C++文字框的轉換結果複製到剪貼簿,再粘貼到UML工具中。
協助工具功能——
1. 在“源參數列表”旁邊有一個“粘貼”按鈕。點擊它便會將剪貼簿中的文本張貼到“源參數列表”文字框中。
2. 在“轉換”按鈕旁邊有一個“自動”複選框。若複選框勾選,當“源參數列表”文字框修改完成時,會自動進行轉換。
3. 在“UML”、“C++”旁邊有一個“複製”按鈕。點擊它可將該文字框的內容複寫到剪貼簿。
4. 在“UML”、“C++”旁邊有一個“粘貼轉換再複製”按鈕。點擊它,將會依次執行“將剪貼簿中的文本張貼到源參數列表”、“轉換”、“將該文字框的內容複寫到剪貼簿”這三項功能。
三、關鍵代碼
該工具的關鍵代碼在paramsFromObjc函數中,用狀態機器去解析Objective-C參數列表字串。
代碼如下——
// 儲存函數參數的類.function FunctionParam(paramname, paramtype) { this.paramname = paramname; this.paramtype = paramtype;}// 將 Objective-C參數列表代碼字串 轉為 FunctionParam 數組.function paramsFromObjc(s) { // == const // 狀態機器的狀態. var STATE_DEFAULT = 0; // 預設. 遇到':'時變為 STATE_WILLPARAMTYPE. var STATE_WILLPARAMTYPE = 1; // 期望參數類型. 遇到'('時變為 STATE_PARAMTYPE. var STATE_PARAMTYPE = 2; // 參數類型. 遇到')'時變為 STATE_WILLPARAMNAME. var STATE_WILLPARAMNAME = 3; // 期望參數名. 遇到非空白時變為 STATE_PARAMNAME. var STATE_PARAMNAME = 4; // 參數名. 遇到非“英文/數字/底線”時提交,並變回 STATE_DEFAULT. // == var var rt = new Array(); var i; do { if (!s) break; var len = s.length; if (!len) break; // 使用狀態機器來解析字串 var state = STATE_DEFAULT; var paramname; var paramtype; for(i=0; i<len; ++i) { //alert(s[i]); var ch = s[i]; switch(state) { case STATE_DEFAULT: { if (':'==ch) { paramname = ""; paramtype = ""; state = STATE_WILLPARAMTYPE; } } break; case STATE_WILLPARAMTYPE: { if ('('==ch) { state = STATE_PARAMTYPE; } } break; case STATE_PARAMTYPE: { if (')'==ch) { state = STATE_WILLPARAMNAME; } else { paramtype = paramtype + ch; } } break; case STATE_WILLPARAMNAME: { if (' '==ch || '\t'==ch || '\r'==ch || '\n'==ch) { } else { paramname = ch; state = STATE_PARAMNAME; } } break; case STATE_PARAMNAME: { if ( ('_'==ch) || ('0'<=ch && ch<='9') || ('A'<=ch && ch<='Z') || ('a'<=ch && ch<='z') ) { paramname = paramname + ch; } else { // 提交. //alert(paramtype + " " + paramname); var p = new FunctionParam(paramname, paramtype); rt.push(p); // 恢複狀態. state = STATE_DEFAULT; } } break; } } // 完成最後一項. if (STATE_PARAMNAME==state) { // 提交. //alert(paramtype + " " + paramname); var p = new FunctionParam(paramname, paramtype); rt.push(p); // 恢複狀態. state = STATE_DEFAULT; } }while(0); return rt;}
四、線上工具
源碼下載——
http://files.cnblogs.com/zyl910/convparam_objc.rar