/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2021-05-8/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/pascal-compiler/sqrparse-2020-02-22/sqrparse3.txt


#include <stdio.h>

#define LEX_ERR_BAD_CHAR                -2
#define LEX_ERR_WRONG_PARAMETER         -3
#define LEX_ERR_BAD_TOKEN               -4

#define WIDTH 6
#define HEIGHT 6

int lexer_width = 0;
int lexer_height = 0;

char bmp[HEIGHT][WIDTH] = {\
           ' ', ' ', ' ', ' ', ' ', ' ',\
           ' ', '#', '#', '#', '#', ' ',\
           ' ', '#', ' ', ' ', '#', ' ',\
           ' ', '#', ' ', ' ', '#', ' ',\
           ' ', '#', '#', '#', '#', ' ',\
           ' ', ' ', ' ', ' ', ' ', ' '};
    

int lexer(int a_limit_width, int a_limit_height, int b_limit_width, int b_limit_height, int c_limit_width, int c_limit_height, int d_limit_width, int d_limit_height, int *a_width, int *a_height, int *b_width, int *b_height, int *c_width, int *c_height, int *d_width, int *d_height);

int lexer(int a_limit_width, int a_limit_height, int b_limit_width, int b_limit_height, int c_limit_width, int c_limit_height, int d_limit_width, int d_limit_height, int *a_width, int *a_height, int *b_width, int *b_height, int *c_width, int *c_height, int *d_width, int *d_height) {
    int i, j;
    int k, l;
    
    for (i = a_limit_height;  i < d_limit_height;  i++) {
        for(j = a_limit_width;  j < b_limit_width;  j++) {
            if ((bmp[i][j] != ' ') && (bmp[i][j] != '#'))
                return LEX_ERR_BAD_CHAR;
            if (bmp[i][j] == '#')
                break;
        }
        if(bmp[i][j] == '#')
            break;  
    }
    
    *a_height = i;
    *a_width = j;
    
    if (a_limit_height != b_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    if (b_limit_width <= a_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *a_height,  l = *a_width;  l < b_limit_width;   l++) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        if (((k - 1) >= 0) && (l > (*a_width)) && (bmp[k][l+1] != ' ')) {
            if (bmp[k-1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k-1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (((k + 1) < (HEIGHT - 1))  && (l > (*a_width)) && (bmp[k][l+1] != ' ')) {
            if (bmp[k+1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k+1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (bmp[k][l+1] == ' ')
            break;
    }
    
    *b_height = k;
    *b_width = l;
    
    if (c_limit_width != b_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    if (c_limit_height <= b_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *b_height,  l = *b_width;  k < c_limit_height;   k++) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        if (((l - 1) >= 0) && (k > (*b_height)) && (bmp[k+1][l] != ' ')) {
            if (bmp[k][l-1] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k][l-1] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (((l + 1) < (WIDTH - 1))  && (k > (*b_height)) && (bmp[k+1][l] != ' ')) {
            if (bmp[k][l+1] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k][l+1] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (bmp[k+1][l] == ' ')
            break;
    }

    *c_height = k;
    *c_width = l;

    if (d_limit_height != c_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    if (d_limit_width >= c_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *c_height,  l = *c_width;  l >= d_limit_width;   l--) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        if (((k - 1) >= 0) && (l > (*d_width)) && (bmp[k][l-1] != ' ')) {
            if (bmp[k-1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k-1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (((k - 1) >= 0)  && (l > (*d_width)) && (bmp[k][l-1] != ' ')) {
            if (bmp[k+1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k+1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (bmp[k][l-1] == ' ')
            break;
    }

    
    *d_height = k;
    *d_width = l;

    
    if (a_limit_width != d_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    if (d_limit_height <= a_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *d_height,  l = *d_width;  k >= a_limit_height;   k--) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        
        /* Bitte ergaenzen */
        
        if (bmp[k-1][l] == ' ')
            break;
    }

}

void test_init(void) {
    int i, j;
    
    /*for(i = 0;  i < HEIGHT;  i++)
        for(j = 0;  j < WIDTH;  j++)
            bmp[i][j] = ' ';
        
    bmp[28][28] = '#';*/
    
    
return;
}

int main(void) {    
    int a_width, a_height;
    int b_width, b_height;
    int c_width, c_height;
    int d_width, d_height;
    test_init();
    lexer(0, 0, WIDTH, 0, WIDTH, HEIGHT, 0, HEIGHT, &a_width, &a_height, &b_width, &b_height, &c_width, &c_height, &d_width, &d_height);
    
    printf("a: %i %i\n", a_height, a_width);
    printf("b: %i %i\n", b_height, b_width);
    printf("c: %i %i\n", c_height, c_width);
    printf("d: %i %i\n", d_height, d_width);
}



So, ich habe das jetzt mit den Quadraten hinbekommen - nächster Beitrag. Da war noch ein Bug im Lexer - übernächster Beitrag. Jetzt wird aktuell der Fehler nicht festgestellt, bei der Kante b-c und c-d, ob hier sich zum Beispiel Vierecke schneiden - also, ob da an der Seite in '#' ist, bzw. ob die Breite einer Kante nicht = 1 ist. Weil, da war noch ein Bug drin, der muss noch beim "Lexer" korrigiert werden. Das mache ich aber erste später. Jetzt gehe ich davon aus, dass der Benutzer in dieser Hinsicht keine falschen Eingaben macht. Im Über-Über-Nächsten Beitrag stelle ich dar, wie die Ausgabe entsprechend der Quadrate in der Ausgangs-/Daten-/Code-Datei sind.

Was der Parser noch nicht kann - das mache ich jetzt gleich - ist schnell gemacht, nämlich Vierecke daneben und Vierecke da drunter. Bisher geht nur in sich verschachtelte Vierecke - aber das ist schnell gemacht.