有限状态机的实现
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define START 0
#define STOP 2
#define BUILD_ID 3
#define BUILD_NUM 4
#define IDENTIFER 5
#define NUMBER 6
#define ERROR 1
char s[100];
int i = 0;
int fsm(int state)
{
char c;
int next_state;
if (state == START) {
scanf("%c", &c);
if (isblank(c))
next_state = START;
else if (isalpha(c)) {
next_state = BUILD_ID;
s[i++] = c;
}
else if (isdigit(c)) {
next_state = BUILD_NUM;
s[i++] = c;
}
else if (c == ';') next_state = STOP;
else next_state = ERROR;
}
else if (state == BUILD_ID) {
scanf("%c", &c);
if (isalpha(c) || isdigit(c) || c == '_') {
next_state = BUILD_ID;
s[i++] = c;
}
else if (isblank(c))
next_state = IDENTIFER;
else {
s[i++] = c;
next_state = ERROR;
}
}
else if (state == BUILD_NUM) {
scanf("%c", &c);
if (isblank(c))
next_state = NUMBER;
else if (isdigit(c)) {
next_state = BUILD_NUM;
s[i++] = c;
}
else {
s[i++] = c;
next_state = ERROR;
}
}
else if (state == IDENTIFER) {
printf("%s: Identifer\n", s);
memset(s, 0, sizeof(s));
i = 0;
next_state = START;
}
else if (state == NUMBER) {
printf("%s: Number\n", s);
memset(s, 0, sizeof(s));
i = 0;
next_state = START;
}
return next_state;
}
int main()
{
int state_now = START;
do {
state_now = fsm(state_now);
} while (state_now != STOP && state_now != ERROR);
if (state_now == ERROR) printf("%s: Invalid input\n", s);
return 0;
}