Вот программа на C, которую вы можете использовать для проверки своего кода:
// -*- coding: utf-8 -*-
#include <stdio.h>
#include <stdlib.h> // EXIT_*
#define log(msg) do { \
puts(msg); \
} while(0)
/** $ graph-easy --input=fsm.dot --as=boxart
┌─────────────────────────────────────────┐
│ │
│ [^a] │
│ ┌───────────────────┐ │
│ ▼ │ │
│ ╔═══════╗ [^a] ╔════╗ │
│ ║ ║ ───────┐ ║ ║ │
│ ║ START ║ │ ║ O ║ │ a
└──── ║ ║ ◀──────┘ ║ ║ ─┐ │
╚═══════╝ ╚════╝ │ │
│ │ │ │
│ │ a │ │
│ ▼ │ │
│ ╔════╗ │ │
│ ┌─────── ║ A ║ ◀┼───────┘
│ │ ╚════╝ │
│ │ │ │
│ │ │ n │
│ │ ▼ │
│ │ ╔════╗ │
│ │ ║ N ║ ─┼───────┐
│ │ ╚════╝ │ │
│ │ │ │ │
│ │ │ d │ │
│ │ ▼ │ │
╔═════╗ EOS │ │ ╔════╗ │ │
║ END ║ ◀────────┼────────┼─────── ║ D ║ │ │
╚═════╝ │ │ ╚════╝ │ │
│ │ │ │ │
│ │ [^n]? │ . │ EOS │ [^d]?
│ │ ▼ ▼ ▼
│ │ ╔══════════════════════╗
│ └──────▶ ║ ║
│ ║ ERROR ║
│ EOS ║ ║
└───────────────▶ ║ ║
╚══════════════════════╝
*/
typedef enum State {
O, START, A, N, D, ERROR
} State;
static int next_token(void) {
int ch = getchar();
if (ch == '\n') // consider newline as EOS
return EOF;
return ch;
}
static int spell_check(void) {
State state = O;
int token = -1;
while ((token = next_token()) != EOF) {
switch(state) {
case START:
log("I am comming");
// fall through
case O:
state = token == 'a' ? A : START; break;
case A:
state = token == 'n' ? N : ERROR; break;
case N:
state = token == 'd' ? D : ERROR; break;
case D:
state = ERROR; break;
case ERROR:
return EXIT_FAILURE;
default:
log("can't happen");
return EXIT_FAILURE;
}
}
if (state == O)
log("This is an empty string");
return state == D ? EXIT_SUCCESS : EXIT_FAILURE;
}
int main(void) {
int rc = spell_check();
if (rc == EXIT_SUCCESS)
log(" Your keyword spelling is correct");
else
log("Wrong keyword spelling");
return rc;
}
Использование:
$ gcc *.c && (echo and | ./a.out; echo $?)
Выход:
Your keyword spelling is correct
0