/**************************************************************************** * num2fsm.c * David Boozer * (v1.0) March 30, 1999 * (v1.1) April 28, 2000 ***************************************************************************** * Translate number representation of Turing machine into finite state machine * representation of Turing machine. ****************************************************************************/ #include #define B0 0 #define B1 1 #define R0 2 #define R1 3 #define L0 4 #define L1 5 #define ER 6 #define XX 7 #define SP 8 int next [2][14] = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ /* 0 */ 0, 8, 3, 4, 5, 6, 7, 0, 9, 0, 11, 12, 0, 3, /* 1 */ 1, 2, 0, 0, 1, 1, 1, 1, 0, 10, 13, 10, 10, 0 }; int action [2][14] = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ /* 0 */ XX, XX, XX, XX, XX, XX, XX, ER, XX, ER, XX, XX, ER, XX, /* 1 */ XX, XX, SP, ER, R0, R1, L0, L1, ER, B1, XX, B0, B1, ER }; void print_state (int state, int number, char *string) { printf ("%03d %d --> ", state>>1, state & 1); printf ("%03d %s\n", number, string); } int main (int argc, char *argv[]) { int state = 0, number = 0, n = 2; char ch; FILE *input_file; if (argc != 2) { fprintf (stderr, "Syntax: num2fsm \n"); exit (0); } if ((input_file = fopen (argv[1], "r")) == NULL) { fprintf (stderr, "Error reading from file: %s\n", argv[1]); exit (0); } do { ch = fgetc (input_file); if ((ch == '0') || (ch == '1')) { switch (action[ch-'0'][state]) { case B0: number = number<<1 | 0; break; case B1: number = number<<1 | 1; break; case R0: print_state (n++, number, "0 R"); number = 0; break; case R1: print_state (n++, number, "1 R"); number = 0; break; case L0: print_state (n++, number, "0 L"); number = 0; break; case L1: print_state (n++, number, "1 L"); number = 0; break; case ER: fprintf (stderr, "Syntax error\n"); break; case SP: break; case XX: break; } state = next[ch-'0'][state]; } } while (ch != EOF); fclose (input_file); return (0); }