zoukankan      html  css  js  c++  java
  • [JavaScript] ObjectiveC参数列表语法转换工具。可转为UML或C++语法,用于绘制UML

    作者: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;
    }


    四、在线工具

    源参数列表:

    自动

    UML:

    C++:

    源码下载——
    https://files.cnblogs.com/zyl910/convparam_objc.rar

    作者:zyl910
    版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0.
  • 相关阅读:
    我见过的最完善的log4net配置
    根据身份证号中的日期判断某人是否已满18岁及是否已满60岁
    第三届“百越杯”福建省高校网络空间安全大赛
    PHP-上传文件
    PHP-操作Mysql
    PHP-异常处理
    PHP-错误处理
    Python(算法)-时间复杂度和空间复杂度
    Python-集合
    Python-字典
  • 原文地址:https://www.cnblogs.com/zyl910/p/convparam_objc.html
Copyright © 2011-2022 走看看