Re: Artikel Debian

Na ja, ich brauche doch noch labels, sonst kann ich nicht unterscheiden, sind das klammern oder if's. Auf der anderen Seite, hat das LOOP-Ding, sein Ziel so einfach erfüllt und ich frage mich, kann ich das nicht genauso machen - indem ich zum Beispiel vor y++ einfach ein @ und $ einfüge?

Ja, ich glaube, das hilft und dann war es das auch. Jetzt kommt der Automat

Image Screenshot_20231012_002031

#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 expr [] = "abc*de[fasd,asddsr]qdsda*ghijk";
//char expr [] = "[a,[[[p,q],ca],[d,e]]]f*(mmm(nnn)mm)";
char expr [] = "*(mmm(nnn)mm)";
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) {
    if (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 (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) {
    compound (l);
    followed (l);
}

int followed (int l) {
    int ch = gettoken ();
    int st, xtmp;
    if ((ch >= 'a') \&amp;\&amp; (ch <= 'z')) {
        statechar [y][x] = ch;
        statelevel [y][x] = l;
        x = x+1;
        or_operator (l);
    }
    else
        tokenback ();
}

int compound (int l) {
    if (gettoken () == '(') {
        statechar [y][x] = '@';
        statelevel [y][x] = l;
        x++;
        y++;
        or_operator (l+1);
        if (gettoken () != ')') {
            fprintf (stderr, "fehler klammer vergessen %c %in", expr [i], i);
            exit (1);
        }
    }
    else
        tokenback ();
}




int main (void) {
    int k, l;
    initstates ();
    or_operator (0);


    for (l = 0;  l < 12;  l++) {
        for (k = 0;  k < 12;  k++)
            printf ("(%2c,%2i) ", statechar [l][k], statelevel[l][k]);
        printf ("n");
    }


}