📄 smcobjcgenerator.java
字号:
_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 + -