作者: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;
}
四、在线工具
源码下载—— https://files.cnblogs.com/zyl910/convparam_objc.rar
|
请发表评论