⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smcobjcgenerator.java

📁 SMC takes a state machine stored in a .sm file and generates a State pattern in twelve programming l
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                _source.print(_indent);                _source.println("    {");            }            else if (condition.length() > 0)            {                // No, this is not the first transition but it                // does have a condition. Use an "else if" for                // the condition.                _source.println();                _source.print(_indent);                _source.print("    else if (");                _source.print(condition);                _source.println(")");                _source.println(_indent);                _source.println("    {");            }            else            {                // This is not the first transition and it has                // no condition.                _source.println();                _source.print(_indent);                _source.println("    else");                _source.print(_indent);                _source.println("    {");            }        }        else        {            // There is only one guard. Does this guard have a            // condition.            if (condition.length() == 0)            {                // Actually, this is a plain, old, vaniila                // transition.                indent2 = _indent + "    ";            }            else            {                // Yes, there is a condition.                _source.print(_indent);                _source.print("    if (");                _source.print(condition);                _source.println(")");                _source.print(_indent);                _source.println("    {");                indent2 = _indent + "        ";            }        }        // Now that the necessary conditions are in place, it's        // time to dump out the transitions actions. First, do        // the proper handling of the state change. If this        // transition has no actions, then set the end state        // immediately. Otherwise, unset the current state so        // that if an action tries to issue a transition, it will        // fail.        if (actions.size() == 0 && endStateName.length() > 0)        {            fqEndStateName = endStateName;        }        else if (actions.size() > 0)        {            // Save away the current state if this is a loopback            // transition. Storing current state allows the            // current to be cleared before any actions are            // executed. Remember: actions are not allowed to            // issue transitions and clearing the current state            // prevents them from doing so.            if (loopbackFlag == true)            {                fqEndStateName = "EndStateName";                _source.print(indent2);                _source.print(context);                _source.print("State* ");                _source.print(fqEndStateName);                _source.println(" = [context state];");                _source.println();            }            else            {                fqEndStateName = endStateName;            }        }        // Decide if runtime loopback checking must be done.        if (defaultFlag == true &&            transType == Smc.TRANS_SET &&            loopbackFlag == false)        {            _source.print(indent2);            _source.print("if ( [[[context state] name] ");            _source.print("isEqualToString:[");            _source.print(fqEndStateName);            _source.println(" name]] )");            _source.print(indent2);            _source.println("{");            _source.print(indent2);            _source.println("    loopbackFlag = YES;");            _source.print(indent2);            _source.println("}");            _source.println();        }        // Before doing anything else, perform the current        // state's exit actions.        // v. 1.0, beta 3: Not any more. The exit actions are        // executed only if 1) this is a standard, non-loopback        // transition or a pop transition.        if (transType == Smc.TRANS_POP ||            loopbackFlag == false)        {            indent4 = indent2;            // If this is a non-loopback, generic transition,            // do runtime loopback checking.            if (transType == Smc.TRANS_SET &&                defaultFlag == true)            {                indent4 = indent2 + "    ";                _source.print(indent2);                _source.println("if (!loopbackFlag)");                _source.print(indent2);                _source.println("{");            }            _source.print(indent4);            _source.println(                "[[context state] Exit:context];");            if (transType == Smc.TRANS_SET &&                defaultFlag == true)            {                _source.print(indent2);                _source.println("}");                _source.println();            }        }        if (actions.isEmpty() == false)        {            // Now that we are in the transition, clear the            // current state.            _source.print(indent2);            _source.println("[context clearState];");        }        // Dump out this transition's actions.        if (actions.isEmpty() == true)        {            if (condition.length() > 0)            {                _source.print(indent2);                _source.println("// No actions.");            }            indent3 = indent2;        }        else        {            indent3 = indent2;            indent4 = _indent;            _indent = indent3;            for (SmcAction action: actions)            {                action.accept(this);            }            _indent = indent4;        }        // Print the setState() call, if necessary. Do NOT        // generate the set state if:        // 1. The transition has no actions AND is a loopback OR        // 2. This is a push or pop transition.        //        // v. 2.0.2: The following code must be generated twice -        // once for the try body and again for the catch body.        // Unlike Java, C++ does not have a finally clause.        if (transType == Smc.TRANS_SET &&            (actions.isEmpty() == false ||             loopbackFlag == false))        {            _source.print(indent3);            _source.print("[context setState:");            _source.print(fqEndStateName);            _source.println("];");        }        else if (transType == Smc.TRANS_PUSH)        {            // Set the end state so that it can be pushed            // onto the state stack. But only do so if a clear            // state was done.            if (loopbackFlag == false || actions.size() > 0)            {                _source.print(indent3);                _source.print("[context setState:");                _source.print(fqEndStateName);                _source.println("];");            }            // Before doing the push, execute the end state's            // entry actions (if any) if this is not a loopback.            if (loopbackFlag == false)            {                if (defaultFlag == true)                {                    indent4 = indent3 + "    ";                    _source.println();                    _source.print(indent3);                    _source.println("if (!loopbackFlag)");                    _source.print(indent3);                    _source.println("{");                }                else                {                    indent4 = indent3;                    _source.println();                }                _source.print(indent4);                _source.println(                    "[[context state] Entry:context];");                if (defaultFlag == true)                {                    _source.print(indent3);                    _source.println("}");                }            }            _source.print(indent3);            _source.print("[context pushState:");            _source.print(pushStateName);            _source.println("];");        }        else if (transType == Smc.TRANS_POP)        {            _source.print(indent3);            _source.println("[context popState];");        }        // Perform the new state's entry actions.        // v. 1.0, beta 3: Not any more. The entry actions are        // executed only if 1) this is a standard, non-loopback        // transition or a push transition.        if ((transType == Smc.TRANS_SET &&             loopbackFlag == false) ||             transType == Smc.TRANS_PUSH)        {            // If this is a non-loopback, generic transition,            // do runtime loopback checking.            if (transType == Smc.TRANS_SET &&                defaultFlag == true)            {                indent4 = indent2 + "    ";                _source.println();                _source.print(indent2);                _source.println("if (!loopbackFlag)");                _source.print(indent2);                _source.println("{");            }            else            {                indent4 = indent2;            }            _source.print(indent4);            _source.println(                "[[context state] Entry:context];");            if (transType == Smc.TRANS_SET &&                defaultFlag == true)            {                _source.print(indent2);                _source.println("}");            }        }        // If there is a transition associated with the pop, then        // issue that transition here.        if (transType == Smc.TRANS_POP &&            endStateName.equals(NIL_STATE) == false &&            endStateName.length() > 0)        {            String popArgs = guard.getPopArgs();            int popLength = popArgs.length();            _source.print(indent2);            _source.print("[context ");            _source.print(endStateName);            // Output any and all pop arguments.            if (popLength > 0)            {                int cur;                int comma;                for (cur = 0, comma = popArgs.indexOf(',');                     comma >= 0;                     cur = (comma + 1),                         comma = popArgs.indexOf(',', cur))                {                    _source.print(':');                    _source.print(popArgs.substring(cur, comma));                }                if (cur < popLength)                {                    _source.print(':');                    _source.print(popArgs.substring(cur));                }            }            _source.println("];");        }        // If this is a guarded transition, it will be necessary        // to close off the "if" body. DON'T PRINT A NEW LINE!        // Why? Because an "else" or "else if" may follow and we        // won't know until we go back to the transition source        // generator whether all clauses have been done.        if (_guardCount > 1)        {            _source.print(_indent);            _source.print("    }");        }        return;    } // end of visit(SmcGuard)    public void visit(SmcAction action)    {        String name = action.getName();        String sep = ":";        // Need to distinguish between FSMContext actions and        // application class actions. If the action is        // "emptyStateStack", then pass it to the context.        // Otherwise, let the application class handle it.        _source.print(_indent);        if (name.equals("emptyStateStack") == true)        {            _source.print("[context ");        }        else        {            _source.print("[ctxt ");        }        _source.print(name);        for (String arg: action.getArguments())        {            if (arg.trim().length() > 0)            {                _source.print(sep);                _source.print(arg);            }        }        _source.println("];");        return;    } // end of visit(SmcAction)    public void visit(SmcParameter parameter)    {        _source.print("(");        _source.print(parameter.getType());        _source.print(")");        _source.print(parameter.getName());        return;    } // end of visit(SmcParamter)    // Converts the SMC scope syntax to Objective-C syntax.    private String convertScope(String s)    {        int index = s.indexOf("::");        return ("[" +                s.substring(0, index) +                " " +                s.substring((index + 2)) +                "]");    } // end of convertScope(String)//---------------------------------------------------------------// Member data//} // end of class SmcObjCGenerator//// CHANGE LOG// $Log: SmcObjCGenerator.java,v $// Revision 1.4  2008/03/21 14:03:16  fperrad// refactor : move from the main file Smc.java to each language generator the following data ://  - the default file name suffix,//  - the file name format for the generated SMC files//// Revision 1.3  2007/08/05 14:36:12  cwrapp// Version 5.0.1 check-in. See net/sf/smc/CODE_README.txt for more informaiton.//// Revision 1.2  2007/02/21 13:55:59  cwrapp// Moved Java code to release 1.5.0//// Revision 1.1  2007/01/15 00:23:51  cwrapp// Release 4.4.0 initial commit.////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -