📄 smcperlgenerator.java
字号:
_source.print(state.getClassName()); _source.print("', "); _source.print(map.getNextStateId()); _source.println(");"); } // Instantiate a default state as well. _source.print(" $Default = new "); _source.print(mapName); _source.print("_Default('"); _source.print(mapName); _source.println(".Default', -1);"); _source.println("}"); return; } // end of visit(SmcMap) public void visit(SmcState state) { SmcMap map = state.getMap(); String packageName = map.getFSM().getPackage(); String mapName = map.getName(); String stateName = state.getClassName(); List<SmcAction> actions; String indent2; // If a package has been specified, if (packageName != null && packageName.length() > 0) { mapName = packageName + "::" + mapName; } // Declare the inner state class. _source.println(); _source.print("package "); _source.print(mapName); _source.print('_'); _source.print(stateName); _source.println(";"); _source.print(" use base qw("); _source.print(mapName); _source.println("_Default);"); // Add the Entry() and Exit() member functions if this // state defines them. actions = state.getEntryActions(); if (actions != null && actions.size() > 0) { _source.println(); _source.println(" sub Entry {"); _source.println(" my $self = shift;"); _source.println(" my ($fsm) = @_;"); // Declare the "ctxt" local variable. _source.println( " my $ctxt = $fsm->getOwner();"); // Generate the actions associated with this code. indent2 = _indent; _indent = " "; for (SmcAction action: actions) { action.accept(this); } _indent = indent2; // End the Entry() member function with a return. _source.println(" }"); } actions = state.getExitActions(); if (actions != null && actions.size() > 0) { _source.println(); _source.println(" sub Exit {"); _source.println(" my $self = shift;"); _source.println(" my ($fsm) = @_;"); // Declare the "ctxt" local variable. _source.println( " my $ctxt = $fsm->getOwner();"); // Generate the actions associated with this code. indent2 = _indent; _indent = " "; for (SmcAction action: actions) { action.accept(this); } _indent = indent2; // End the Exit() member function with a return. _source.println(" }"); } // Have each transition generate its code. for (SmcTransition transition: state.getTransitions()) { transition.accept(this); } // If -reflect was specified, then generate the // _transitions table. if (Smc.isReflection() == true) { List<SmcTransition> allTransitions = map.getFSM().getTransitions(); List<SmcTransition> stateTransitions = state.getTransitions(); SmcState defaultState = map.getDefaultState(); List<SmcTransition> defaultTransitions; String transName; int transDefinition; // Initialize the default transition list to all the // default state's transitions. if (defaultState != null) { defaultTransitions = defaultState.getTransitions(); } else { defaultTransitions = new ArrayList<SmcTransition>(); } // Generate the getTransitions() method. _source.println(); _source.println(" sub getTransitions {"); _source.println(" return {"); // Now place all transition names and states into the // map. for (SmcTransition transition: allTransitions) { transName = transition.getName(); // If the transition is in this state, then its // value is 1. if (stateTransitions.contains( transition) == true) { transDefinition = 1; } // If the transition is defined in this map's // default state, then the value is 2. else if (defaultTransitions.contains( transition) == true) { transDefinition = 2; } // Otherwise the value is 0 - undefined. else { transDefinition = 0; } _source.print(" '"); _source.print(transName); _source.print("' => "); _source.print(transDefinition); _source.println(","); } _source.println(" };"); _source.println(" }"); } // End of this state class declaration. return; } // end of visit(SmcState) public void visit(SmcTransition transition) { SmcState state = transition.getState(); SmcMap map = state.getMap(); String packageName = map.getFSM().getPackage(); String mapName = map.getName(); String stateName = state.getClassName(); String transName = transition.getName(); List<SmcParameter> parameters = transition.getParameters(); List<SmcGuard> guards = transition.getGuards(); boolean nullCondition = false; Iterator<SmcParameter> pit; Iterator<SmcGuard> git; SmcGuard guard; // If a package has been specified, if (packageName != null && packageName.length() > 0) { mapName = packageName + "::" + mapName; } _source.println(); _source.print(" sub "); _source.print(transName); _source.println(" {"); _source.println(" my $self = shift;"); _source.print(" my ($fsm"); // Add user-defined parameters. for (SmcParameter param: parameters) { _source.print(", "); _source.print(param.getName()); } _source.println(") = @_;"); // All transitions have a "ctxt" local variable. // 8/14/2003: // Do this only if there are any transition actions or // guard conditions which reference it. if (transition.hasCtxtReference() == true) { _source.println( " my $ctxt = $fsm->getOwner();"); } // Output transition to debug stream. if (Smc.isDebug() == true) { String sep; _source.println( " if ($fsm->getDebugFlag()) {"); _source.println( " my $fh = $fsm->getDebugStream();"); _source.print( " print $fh \"TRANSITION : "); _source.print(mapName); _source.print("::"); _source.print(stateName); _source.print("->"); _source.print(transName); _source.print("("); for (pit = parameters.iterator(), sep = ""; pit.hasNext() == true; sep = ", ") { _source.print(sep); _source.print((pit.next()).getName()); } _source.print(")"); _source.println("\\n\";"); _source.println(" }"); } // Loop through the guards and print each one. _indent = " "; for (git = guards.iterator(), _guardIndex = 0, _guardCount = guards.size(); git.hasNext() == true; ++_guardIndex) { guard = (SmcGuard) git.next(); // Count up the guards with no condition. if (guard.getCondition().length() == 0) { nullCondition = true; } guard.accept(this); } // If all guards have a condition, then create a final // "else" clause which passes control to the default // transition. Pass all arguments into the default // transition. if (_guardIndex > 0 && nullCondition == false) { if (_guardCount == 1) { _source.println(" }"); } _source.println(" else {"); // Call the super class' transition method using // the "super" keyword and not the class name. _source.print(" "); _source.print("$self->SUPER::"); _source.print(transName); _source.print("($fsm"); for (SmcParameter param: parameters) { _source.print(", $"); _source.print(param.getName()); } _source.println(");"); _source.println(" }"); } // Need to add a final newline after a multiguard block. else if (_guardCount > 1) { _source.println(); } _source.println(" }"); return; } // end of visit(SmcTransition) public void visit(SmcGuard guard) { SmcTransition transition = guard.getTransition(); SmcState state = transition.getState(); SmcMap map = state.getMap(); String packageName = map.getFSM().getPackage(); String context = map.getFSM().getContext(); String mapName = map.getName(); String stateName = state.getClassName(); int transType = guard.getTransType(); boolean defaultFlag = stateName.equalsIgnoreCase("Default"); boolean loopbackFlag = false; String indent2; String indent3; String indent4; String endStateName = guard.getEndState(); String fqEndStateName = ""; String pushStateName = guard.getPushState(); String condition = guard.getCondition(); List<SmcAction> actions = guard.getActions(); // If a package has been specified, if (packageName != null && packageName.length() > 0) { mapName = packageName + "::" + mapName; context = packageName + "::" + context; } // If this guard's end state is not of the form // "map::state", then prepend the map name to the // state name. // DON'T DO THIS IF THIS IS A POP TRANSITION! // The "state" is actually a transition name. if (transType != Smc.TRANS_POP && endStateName.length () > 0 && endStateName.equals(NIL_STATE) == false && endStateName.indexOf("::") < 0) { endStateName = mapName + "::" + endStateName; } // Qualify the state and push state names as well. if (stateName.indexOf("::") < 0) { stateName = mapName + "::" + stateName; } // v. 2.0.2: If the push state is not fully-qualified, // then prepend the current map's name and make if // fully-qualified. if (pushStateName != null && pushStateName.length() > 0) { if (pushStateName.indexOf("::") < 0) { pushStateName = mapName + "::" + pushStateName; } else if (packageName != null && packageName.length() > 0) { pushStateName = packageName + "::" + pushStateName; } } loopbackFlag = isLoopback(transType, stateName, endStateName); // The guard code generation is a bit tricky. The first // question is how many guards are there? If there are // more than one, then we will need to generate the // proper "if-then-else" code. if (_guardCount > 1) { indent2 = _indent + " "; // There are multiple guards. // Is this the first guard? if (_guardIndex == 0 && condition.length() > 0) { // Yes, this is the first. This means an "if" // should be used. _source.print(_indent); _source.print(" if ("); _source.print(condition); _source.println(") {"); } else if (condition.length() > 0) { // No, this is not the first transition but it // does have a condition. Use an "else if". _source.println(); _source.print(_indent); _source.print(" elsif ("); _source.print(condition);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -