📄 smcphpgenerator.java
字号:
} else { // This is not the first transition and it has // no condition. _source.println("else {"); } } // There is only one guard. Does this guard have // a condition? else if (condition.length() == 0) { // No. This is a plain, old. vanilla transition. indent2 = _indent; } else { // Yes there is a condition. indent2 = _indent + " "; _source.print(_indent); _source.print("if ("); _source.print(condition); _source.println(") {"); } // Now that the necessary conditions are in place, it's // time to dump out the transition's 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 state 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 do. if (loopbackFlag == true) { fqEndStateName = "$endState"; _source.print(indent2); _source.print(fqEndStateName); _source.println(" = $fsm->getState();"); } else { fqEndStateName = endStateName; } } // Decide if runtime loopback checking must be done. if (defaultFlag == true && transType != Smc.TRANS_POP && loopbackFlag == false) { _source.print(indent2); _source.print( "$loopbackFlag = $fsm->getState()->getName() == "); _source.print(fqEndStateName); _source.println("->getName();"); } // Dump out the exit actions - but only for the first // guard. // 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 == false) {"); } _source.print(indent4); _source.println("$fsm->getState()->Exit_($fsm);"); if (transType == Smc.TRANS_SET && defaultFlag == true) { _source.print(indent2); _source.println("}"); } } // Dump out this transition's actions. if (actions.isEmpty() == true) { List<SmcAction> entryActions = state.getEntryActions(); List<SmcAction> exitActions = state.getExitActions(); // If this is an if or else body, then give it a // pass. if (condition.length() > 0 || _guardCount > 1) { _source.print(indent2); _source.println("# No actions."); } // If there are: // 1. No entry actions, // 2. No exit actions, // 3. Only one guard, // 4. No condition, // 5. No actions, // 6. Not a loopback, push or pop transition and // 7. No debug code being generated. // then give this transition a pass. else if (_guardCount == 1 && (entryActions == null || entryActions.isEmpty() == true) && (exitActions == null || exitActions.isEmpty() == true) && transType != Smc.TRANS_PUSH && transType != Smc.TRANS_POP && loopbackFlag == true && Smc.isDebug() == false) { _source.print(indent2); _source.println("# No actions."); _source.print(indent2); } indent3 = indent2; } else { // Now that we are in the transition, clear the // current state. _source.print(indent2); _source.println("$fsm->clearState();"); // v. 2.0.0: Place the actions inside a try/finally // block. This way the state will be set before an // exception leaves the transition method. // v. 2.2.0: Check if the user has turned off this // feature first. if (Smc.isNoCatch() == false) { _source.print(indent2); _source.println("$exception = NULL;"); _source.print(indent2); _source.println("try {"); indent3 = indent2 + " "; } else { indent3 = indent2; } indent4 = _indent; _indent = indent3; for (SmcAction action: actions) { action.accept(this); } _indent = indent4; // v. 2.2.0: Check if the user has turned off this // feature first. // PHP has no 'finally', thus emulate it with catch // and rethrow at the end. // http://bugs.php.net/bug.php?id=32100 if (Smc.isNoCatch() == false) { _source.print(indent2); _source.println("}"); _source.print(indent2); _source.println("catch (Exception $exception) {}"); } } // Print the setState() call, if necessary. Do NOT // generate the set state it: // 1. The transition has no actions AND is a loopback OR // 2. This is a push or pop transition. if (transType == Smc.TRANS_SET && (actions.isEmpty() == false || loopbackFlag == false)) { _source.print(indent2); _source.print("$fsm->setState("); _source.print(fqEndStateName); _source.println(");"); } else if (transType == Smc.TRANS_PUSH) { // Set the next state so this it can be pushed // onto the state stack. But only do so if a clear // state was done. if (loopbackFlag == false || actions.isEmpty() == false) { _source.print(indent2); _source.print("$fsm->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 = indent2 + " "; _source.print(indent2); _source.println("if ($loopbackFlag == false) {"); } else { indent4 = indent2; } _source.print(indent4); _source.println("$fsm->getState()->Entry($fsm);"); if (defaultFlag == true) { _source.print(indent2); _source.println("}"); } } _source.print(indent2); _source.print("$fsm->pushState("); _source.print(pushStateName); _source.println(");"); } else if (transType == Smc.TRANS_POP) { _source.print(indent2); _source.println("$fsm->popState();"); } // Perform the new state's enty 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) { 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 == false) {"); } _source.print(indent4); _source.println("$fsm->getState()->Entry($fsm);"); if (transType == Smc.TRANS_SET && defaultFlag == true) { _source.print(indent2); _source.println("}"); } } // If there was a try/finally, then put the closing // brace on the finally block. // v. 2.2.0: Check if the user has turned off this // feature first. // PHP: rethrow the exception to emulate finally. if (actions.size() > 0 && Smc.isNoCatch() == false) { _source.print(indent2); _source.println("if ($exception != NULL) {"); _source.print(indent2); _source.println(" throw $exception;"); _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(); _source.print(indent2); _source.print("$fsm->"); _source.print(endStateName); _source.print("("); // Output any and all pop arguments. if (popArgs.length() > 0) { _source.print(popArgs); _source.println(); _source.print(indent2); _source.println(");"); } else { _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(); Iterator<String> it; 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("$fsm->"); } else { _source.print("$ctxt->"); } _source.print(name); _source.print("("); for (it = action.getArguments().iterator(), sep = ""; it.hasNext() == true; sep = ", ") { _source.print(sep); _source.print(it.next()); } _source.println(");"); return; } // end of visit(SmcAction) public void visit(SmcParameter parameter) { String type = parameter.getType(); if (type.equals("")) { _source.print(parameter.getName()); } else { _source.print(type); _source.print(" "); _source.print(parameter.getName()); } return; } // end of visit(SmcParameter)//---------------------------------------------------------------// Member data//} // end of class SmcPhpGenerator//// CHANGE LOG// $Log: SmcPhpGenerator.java,v $// Revision 1.1 2008/04/22 16:05:24 fperrad// - add PHP language (patch from Toni Arnold)////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -