/* * Java コードの生成 */ /* * Context.java */ fout.open("Context.java"); if ( fsm.package.empty() ) { fout << "package " << fsm.name << ";" LN LN; } else { fout << "package " << fsm.package << '.' << fsm.name << ";" LN LN; } fout << "public interface Context {" LN << " void error(String state_name, String event_name);" LN ; for ( nit = fsm.action_names.begin(); nit != fsm.action_names.end(); ++nit ) { fout << " void " << *nit << "(FSM fsm);" LN; } fout << "}" LN LN; fout.close(); /* * State.java */ fout.open("State.java"); if ( fsm.package.empty() ) { fout << "package " << fsm.name << ";" LN LN; } else { fout << "package " << fsm.package << '.' << fsm.name << ";" LN LN; } /* * State(base) */ fout << "public abstract class State {" LN " abstract public String getName();" LN " public void enter(FSM fsm) {}" LN " public void exit(FSM fsm) {}" LN; for ( nit = fsm.event_names.begin(); nit != fsm.event_names.end(); ++nit ) { fout << " public void " << *nit << "(FSM fsm) { fsm.getContext().error(getName(), \"" << *nit << "\"); }" LN; } fout << "}" LN LN; fout.close(); /* * FSM.java */ fout.open("FSM.java"); if ( fsm.package.empty() ) { fout << "package " << fsm.name << ";" LN LN; } else { fout << "package " << fsm.package << '.' << fsm.name << ";" LN LN; } /* * State */ for ( sit = fsm.states.begin(); sit != fsm.states.end(); ++sit) { fout << "class " << sit->name << "State extends State {" LN " public String getName() { return \"" << sit->name << "\"; }" LN; if ( !sit->enter.empty() ) { fout << " public void enter(FSM fsm) { fsm.getContext()." << sit->enter << "(fsm); }" LN; } if ( !sit->exit.empty() ) { fout << " public void exit(FSM fsm) { fsm.getContext()." << sit->exit << "(fsm); }" LN; } for ( eit = sit->events.begin(); eit != sit->events.end(); ++eit ) { fout << " public void " << eit->name << "(FSM fsm) {" LN " Context context = fsm.getContext();" LN; if ( eit->transition.empty() ) { fout << " fsm.setNewState(this);" LN; } else { fout << " fsm.setNewState(fsm." << eit->transition << "());" LN; } if ( !eit->action.empty() ) { fout << " context." << eit->action << "(fsm);" LN; } States::const_iterator tit = eit->transition.empty() ? sit : fsm.states.find(State(eit->transition)); if ( eit->transition.empty() ) { fout << " if ( fsm.getNewState() != this ) {" LN " exit(fsm);" LN " fsm.setState();" LN " fsm.getState().enter(fsm);" LN " } else {" LN " fsm.setState();" LN " }" LN; } else { if ( !sit->exit.empty() ) { fout << " exit(fsm);" LN; } fout << " fsm.setState();" LN; if ( !tit->enter.empty() ) { fout << " fsm.getState().enter(fsm);" LN; } } fout << " }" LN; } fout << "}" LN LN; } /* * FSM */ fout << "public class FSM {" LN " Context context_;" LN " State state_;" LN " State terminal_;" LN " State newstate_;" LN; for ( nit = fsm.state_names.begin(); nit != fsm.state_names.end(); ++nit ) { fout << " private final static " << *nit << "State " << *nit << "_ = new " << *nit << "State();" LN; } fout << LN; fout << " public FSM() { state_ = " << fsm.initial << "_; "; if ( fsm.terminal.empty() ) { fout << "terminal_ = null; }" LN; } else { fout << "terminal_ = " << fsm.terminal << "State_; }" LN; } fout << " public boolean isTerminated() { return state_ == terminal_; }" LN LN " public void setContext(Context context) { context_ = context; }" LN " public Context getContext() { return context_; }" LN LN " public void setNewState(State state) { newstate_ = state; }" LN " public State getNewState() { return newstate_; }" LN LN " public void setState(State state) { state_ = state; }" LN " public void setState() { state_ = newstate_; }" LN " public State getState() { return state_; }" LN; for ( nit = fsm.state_names.begin(); nit != fsm.state_names.end(); ++nit ) { fout << " public static State " << *nit << "() { return " << *nit << "_; }" LN; } fout << LN; for ( nit = fsm.event_names.begin(); nit != fsm.event_names.end(); ++nit ) { fout << " public void " << *nit << "() { state_." << *nit << "(this); }" LN; } fout << "}" LN LN; fout.close();