/* Compilerdirektive */ #include #include #define EPS 256 #define MAX_TOKEN_CLASS 50 #define STRETCH 3 /* Datenstrukturen */ struct liste_typ { int elem; struct liste_typ *next; }; struct operation_typ_h { int start, end; struct operation_typ_h *next; }; struct token_information_typ { int start; int end; struct liste_typ *DEA_end; }; typedef struct liste_typ* htyp; typedef struct operation_typ_h operation_typ; operation_typ* operations; htyp **nea; struct token_information_typ token_information[MAX_TOKEN_CLASS]; struct liste_typ* startzustand; int token_class=0; int akt_zustand=0; int DEA_index, ableitungs_index , endzustaende_index; /* Funktionsdeklarationen */ /* schaetzt die Anzahl der benoetigten Zustaende des nichtdeterministischen Automaten */ int max_anzahl_zustaende(char *name); void init_nea(int bis_zustand); /* gibt Speicherplatz, der durch die nea-Tabelle allokiert ist, wieder frei: */ void delete_nea(struct liste_typ *nea[][EPS], int bis_zustand); /* push fuegt die Nummer eines Folgezustands in liste ein */ void push(struct liste_typ **liste, int nummer); /* nimmt den in nea[][EPS] gespeicherten NEA und fuehrt darauf den Kleene-Abschluss durch. */ void huelle(void); /* Angenommen man hat fuer den regulaeren Ausdruck r den entsprechenden NEA R in nea stehen. Die folgende Prozedur schreibt den Automaten R|buchstabe nach nea */ void vereinigung(void); /* Analog zu vereinigung */ void conc(void); /* liest eine zeile in datei und macht daraus einen NEA: */ void main_loop(char *name); void atom(int buchstabe); void ausgabe(int zustand, int eingabe) { htyp h; printf("(%d, %c) ", zustand, (char) eingabe); h=nea[zustand][eingabe]; while (!(h==NULL)) { printf("%d ", (*h).elem); h=(*h).next; } printf("\n"); } #include "dea.h" main(int argc, char **argv) { int i, j; /*if (argc==1) { printf("Dateinamen angeben !\n"); exit(1); } */ init_nea(STRETCH*max_anzahl_zustaende(argv[1])); main_loop(argv[1]); /* Test */ for(i=0; i<=EPS; i++) for(j=0; j<=akt_zustand; j++) if(!(nea[j][i]==NULL)) ausgabe(j, i); printf("\n Aktueller Zustand: %d\n", akt_zustand); for(i=0; i