/media/sda-magnetic/david/Dok-15-2023-11-27/informatik/pascal/postregs/reg71.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define X   1024
#define Y   1024
#define END -1

int state [Y][X][2];
int statechar [Y][X];
int x;
int y;

int initstates () {
    int k, l;

    for (k = 0;  k < Y;  k++) {
        for (l = 0;  l < X;  l++) {
            state [k][l][0] = state [k][l][1] = END;
            statechar [k][l] = '*';
        }
    }

}

int jx = 0;

//char expr [] = "abc*de[fasd,asddsr]qdsda*ghijk";
char expr [] = "[a,[d,e]]efghijk";
int i = 0;

char gettoken () {
    return expr [i++];
}
void tokenback () {
    i--;
}

/*
aaaa
aaaaaa
aaaaaaa
aaaaaaaa()
*/

int stream ();
int followed ();
int compound ();
int or_operator ();
int repeat_operator ();

int or_operator () {
    if (gettoken () == '[') {
        state [y][x][0] = x+1;
        state [y][x][1] = y+1;
        x++;
        y++;
        or_operator ();
        y--;
        if (gettoken () != ',') {
            fprintf (stderr, "Komma vergessen");
            exit (1);
        }
        state [y][x][0] = x+1;
        state [y][x][1] = y+1;
        x++;
        y++;
        or_operator ();
        y--;
        if (gettoken () != ']') {
            fprintf (stderr, "Klammer vergessen ]");
            exit (1);
        }
        repeat_operator ();
    }
    else {
        tokenback ();
        repeat_operator ();
    }

}


int repeat_operator () {
    if (gettoken () == '*') {
        stream ();
    }
    else {
        tokenback ();
        stream ();
    }

}

int stream () {
    compound ();
    followed ();
}

int followed () {
    int ch = gettoken ();
    int st, xtmp;
    if ((ch >= 'a') && (ch <= 'z')) {
        printf ("%c ", ch);
        state [y][x][0] = y;
        state [y][x][1] = x+1;
        statechar [y][x] = ch;
        x = x+1;
        or_operator ();
        printf ("%i\n", x);

    }
    else
        tokenback ();
}

int compound () {
    if (gettoken () == '(') {
        or_operator ();
        if (gettoken () != ')') {
            fprintf (stderr, "fehler klammer vergessen %c %i\n", expr [i], i);
            exit (1);
        }
    }
    else
        tokenback ();
}




int main (void) {
    int k, l;
    initstates ();
    or_operator (0);
    for (k = 0;  k < 10;  k++) {
        printf ("state[0][%i][x] = %i, state[0][%i][y] = %i ", k, state[0][k][0], k, state[0][k][1]);
        printf ("statechar[0][%i] = %c\n", k, statechar[0][k]);
    }

    for (l = 0;  l < 10;  l++) {
        for (k = 0;  k < 10;  k++)
            printf ("(%2i,%2i,%2c) ", state[l][k][0], state[l][k][1], statechar [l][k]);
        printf ("\n");
    }


}