#include <string.h> #include <stdlib.h> #include <stdio.h> #define M 128 #define K 128 #define scan -1 int N; int j; int expression (); int term (); int factor (); void ststate (int, char, int, int); void dequeinit (); char p [] = "A+B*(AC)"; char a [] = "BACACAC"; char ch[M]; int next1 [M]; int next2 [M]; int state; int queptr; int stackptr; int deque [K]; void dequeinit () { queptr = 0; stackptr = 0; } void push (int v) { deque [stackptr] = v; stackptr++; } int pop () { if (stackptr > 0) stackptr--; return deque [stackptr]; } void put (int v) { deque [stackptr] = v; stackptr++; } int get () { int v; v = deque [queptr]; queptr++; return v; } int dequeempty () { if (queptr >= stackptr) return 1; else return 0; } int letter (char v) { return((v >= 'A') \&\& (v <= 'Z')); } void error () { printf ("Fehler"); } void ststate (int st, char c, int n1, int n2) { ch [st] = c; next1 [st] = n1; next2 [st] = n2; } int expression () { int t1, t2, r; t1 = term (); r = t1; if (p [j] == '+') { j++; state++; t2 = state; r = t2; state++; ststate (t2, ' ', expression(), t1); ststate (t2-1, ' ', state, state); } return r; } int term () { int t, r; r = factor (); if (( p [j] == '(') || letter (p [j])) t = term (); return r; } int factor () { int t1, t2, r; t1 = state; if (p [j] == '(') { j++; t2 = expression (); if (p [j] == ')') j++; else error (); } else if (letter (p [j])) { ststate (state, p[j], state+1, state+1); t2 = state; j++; state++; } else error (); if (p [j] != '*') r = t2; else { ststate (state, ' ', state+1, t2); r = state; next1 [t1-1] = state; j++; state++; } return r; } int match (char *a) { int n1, n2; int j = 0; N = strlen (a), state = next1 [0]; dequeinit (); put (scan); while (scan) { if (state == scan) { j++; put (scan); } else if (ch [state] == a [j]) put (next1 [state]); else if (ch [state] == ' ') { n1 = next1 [state]; n2 = next2 [state]; push (n1); if (n1 != n2) push (n2); } if (dequeempty () || j == N) return 0; state = pop (); } return j; } void printstates () { int i; for (i = 0; i < state; i++) { printf ("%i %c %i %in", i, ch [i], next1 [i], next2 [i]); } } int matchall (char *a) { j = 0; state = 1; next1 [0] = expression (); ststate (0, ' ', next1 [0], next2 [0]); ststate (state, ' ', 0, 0); printstates (); getchar (); while (*a != ' ') printf ("%d ", match (a++)); printf ("n"); } int main (void) { matchall (a); }