public class FSMAgent extends Agent {
public void setup() {
FSMBehaviour fsm = new
Recognizer(this);
addBehaviour(fsm);
}
}
class State extends OneShotBehaviour {
private int event = -1;
private String name;
public State(Agent a, String name) {
super(a);
this.name = name;
}
public void onStart() {
System.out.println("Entering
" + name + " state");
}
public void action() {
ACLMessage msg =
myAgent.blockingReceive();
event
= Integer.valueOf(msg.getContent()).intValue();
System.out.println(
"Exiting " + name +
" state, event = " + event);
}
public int onEnd() { return event; }
}
A recognizer for L = (00)+ | (11)+
class Recognizer extends FSMBehaviour {
private State start, even0, odd0,
even1, odd1, fail;
public Recognizer(Agent a) {
super(a);
// init states:
start = new State(myAgent,
"start");
even0 = new State(myAgent,
"even0");
even1 = new State(myAgent,
"even1");
odd0 = new State(myAgent,
"odd0");
odd1 = new State(myAgent,
"odd1");
fail = new State(myAgent,
"fail");
// register states:
registerFirstState(start,
"start");
registerState(even0,
"even0");
registerState(even1,
"even1");
registerState(fail,
"fail");
registerState(odd0,
"odd0");
registerState(odd1,
"odd1");
// register transitions:
registerTransition("start",
"odd0", 0);
registerTransition("start",
"odd1", 1);
registerTransition("odd0",
"even0", 0, new String[] {"odd0"});
registerTransition("odd1",
"even1", 1, new String[] {"odd1"});
registerTransition("even0",
"odd0", 0, new String[] {"even0"});
registerTransition("even1",
"odd1", 1, new String[] {"even1"});
registerDefaultTransition("even0",
"fail");
registerDefaultTransition("even1",
"fail");
registerDefaultTransition("odd0",
"fail");
registerDefaultTransition("odd1",
"fail");
registerDefaultTransition("fail",
"fail");
registerDefaultTransition("start",
"fail");
// start:
scheduleFirst();
}
}
Using the dummy agent to send 00001000:
Entering start state
Exiting start state, event = 0
Entering odd0 state
Exiting odd0 state, event = 0
Entering even0 state
Exiting even0 state, event = 0
Entering odd0 state
Exiting odd0 state, event = 0
Entering even0 state
Exiting even0 state, event = 1
Entering fail state
Exiting fail state, event = 0
Exiting fail state, event = 0
Exiting fail state, event = 0