[a,a*(a)]
nicht ein zweiter Ausdruck stehen konnte. Generell geht das, das habe ich natürlich implementiert, aber nicht in den eckigen Klammern.
Es muss da auch stehen können
[a,a*(a)a*(a)*]
Der Fehler war schnell behoben. Nach der Abarbeitung einer Komponente des Ausdrucks ruft man die Funktion vom Anfang noch mal auf, wenn es gegeben ist, das heisst, solange relevante Ausdrücke da stehen. Hier der korrigierte Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #define X 1024 #define Y 1024 #define END -1 char statechar [Y][X]; char statelevel [Y][X]; int x; int y; int initstates () { int k, l; for (k = 0; k < Y; k++) { for (l = 0; l < X; l++) { statechar [k][l] = ' '; } } } int jx = 0; char text [] = "abcd"; //char expr [] = "abc*de[fasd,asddsr]qdsda*ghijk"; //char expr [] = "[*([[[([a,[[[p,q*],ca],[d,*(ead)]]]f*(mmm(nnn)mm)),a],asd],semdu]),*poller]"; //char expr [] = "[*([[[([a,[[[p,*(q)],ca],[d,*(ead)]]]f*(mmm(nnn)mm)),a],asd],semdu]),*poller]"; //char expr [] = "*(mmm(nnn)mm)"; char expr [] = "[a,(ef)*]"; //char expr [] = "abcd"; int i = 0; char gettoken () { return expr [i++]; } void tokenback () { i--; } /* aaaa aaaaaa aaaaaaa aaaaaaaa() */ int stream (int); int followed (int); int compound (int); int or_operator (int); int repeat_operator (int); int or_operator (int l) { int ch; if ((ch = gettoken ()) == '[') { or_operator (l+1); if (gettoken () != ',') { fprintf (stderr, "Komma vergessen"); exit (1); } statechar [y][x] = '\$'; statelevel [y][x] = l; x++; y++; or_operator (l+1); if ((ch = gettoken ()) != ']') { fprintf (stderr, "Klammer vergessen ]"); exit (1); } repeat_operator (l); } else { tokenback (); repeat_operator (l); } } int repeat_operator (int l) { if (gettoken () == '*') { stream (l+1); statechar [y][x] = '#'; statelevel [y][x] = l; x++; } else { tokenback (); stream (l); } } int stream (int l) { int r = 0; r = compound (l); r |= followed (l); if (r) { or_operator(l); } } int followed (int l) { int ch = gettoken (); int st, xtmp; if ((ch >= 'a') \&\& (ch <= 'z')) { statechar [y][x] = ch; statelevel [y][x] = l; x = x+1; or_operator (l); return 1; } else { tokenback (); return 0; } } int compound (int l) { int ch; if (gettoken () == '(') { statechar [y][x] = '@'; statelevel [y][x] = l; x++; y++; or_operator (l+1); if ((ch = gettoken ()) != ')') { fprintf (stderr, "fehler klammer vergessen %c %in", expr [i], i); exit (1); } return 1; } else { tokenback (); return 0; } } void automat () { int k; for (k = 0; k < strlen (text); k++) { if (statechar [0][k] == text[k]) printf ("fits %s", text +k); if (statechar [0][k] == '#'); } } int main (void) { int k, l; initstates (); or_operator (0); for (l = 0; l <= y; l++) { for (k = 0; k <= x; k++) printf ("%2c%2i ", statechar [l][k], statelevel[l][k]); printf ("n"); } automat (); }