This approach has the biggest disadvantage that is almost impossible from the code to understand the original FSM diagram.
That's why c-libutl offers simple macros to implement FSM with a 1-to-1 relationship with the original diagram.
I'm pretty sure you will immediately relate this code:
fsm { fsmSTATE(S1) { printf("S1: %d\n",x); x++; if (x > 3) fsmGOTO(S2); fsmGOTO(S1); } fsmSTATE(S3) { printf("S3: %d\n",x); x++; if (x > 9) fsmGOTO(exit); fsmGOTO(S3); } fsmSTATE(S2) { printf("S2: %d\n",x); x++; if (x > 6) fsmGOTO(S3); fsmGOTO(S2); } fsmSTATE(exit) { } }
to this diagram:
The C code for the fsm macros is extremely simple:
#define fsm #define fsmGOTO(x) goto fsm_state_##x #define fsmSTATE(x) fsm_state_##x : #define fsmSTARTThis simple technique was explained by Tim Cooper in the the article [*Goto? Yes Goto!*](http://ftp.math.utah.edu/pub/tex/bib/complang.html#Cooper:1991:GYG) published on the May 1991 issue of the *Computer Language* magazine and, since then, I've found many uses for it.
0 comments :
Post a Comment