/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/pascal-compiler-2020-03-30/germancompiler.c


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

int lex_i = 0;
int lex_n;
char lex_c[4096];


int dot (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if (lex_c[lex_i] == '.') {
        lex_i += 1;
        return 1;
    }
    else {
        printf("Sorry missing 'dot'");
        exit(1);
    }
}

int car (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'A') && \
        (lex_c[lex_i+1] == 'u') && \
        (lex_c[lex_i+2] == 't') && \
        (lex_c[lex_i+3] == 'o')) {
        lex_i += 4;
        return 1;
    }
    else 
        return 0;
}


int tree (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'B') && \
        (lex_c[lex_i+1] == 'a') && \
        (lex_c[lex_i+2] == 'u') && \
        (lex_c[lex_i+3] == 'm')) {
        lex_i += 4;        
        return 1;
    }
    else 
        return 0;
}

int house (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'H') && \
        (lex_c[lex_i+1] == 'a') && \
        (lex_c[lex_i+2] == 'u') && \
        (lex_c[lex_i+3] == 's')) {
        lex_i += 4;
        return 1;
    }
    else 
        return 0;
}

int caesar (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'C') && \
        (lex_c[lex_i+1] == 'a') && \
        (lex_c[lex_i+2] == 'e') && \
        (lex_c[lex_i+3] == 's') && \
        (lex_c[lex_i+4] == 'a') && \
        (lex_c[lex_i+5] == 'r') ) {
        lex_i += 6;
        return 1;
    }
    else 
        return 0;
}

int computer (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'R') && \
        (lex_c[lex_i+1] == 'e') && \
        (lex_c[lex_i+2] == 'c') && \
        (lex_c[lex_i+3] == 'h') && \
        (lex_c[lex_i+4] == 'n') && \
        (lex_c[lex_i+5] == 'e') && \
        (lex_c[lex_i+6] == 'r') ) {
        lex_i += 7;
        return 1;
    }
    else 
        return 0;
}

int speaks (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 's') && \
        (lex_c[lex_i+1] == 'p') && \
        (lex_c[lex_i+2] == 'r') && \
        (lex_c[lex_i+3] == 'i') && \
        (lex_c[lex_i+4] == 'c') && \
        (lex_c[lex_i+5] == 'h') && \
        (lex_c[lex_i+6] == 't') ) {
        lex_i += 7;
        return 1;
    }
    else 
        return 0;
}

int walks (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'g') && \
        (lex_c[lex_i+1] == 'e') && \
        (lex_c[lex_i+2] == 'h') && \
        (lex_c[lex_i+3] == 't') ) {
        lex_i += 4;
        return 1;
    }
    else 
        return 0;
}

int hates (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'h') && \
        (lex_c[lex_i+1] == 'a') && \
        (lex_c[lex_i+2] == 's') && \
        (lex_c[lex_i+3] == 's') && \
        (lex_c[lex_i+4] == 't') ) {
        lex_i += 5;
        return 1;
    }
    else 
        return 0;
}

int hears (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 'h') && \
        (lex_c[lex_i+1] == 'o') && \
        (lex_c[lex_i+2] == 'e') && \
        (lex_c[lex_i+3] == 'r') && \
        (lex_c[lex_i+4] == 't') ) {
        lex_i += 5;
        return 1;
    }
    else 
        return 0;
}


int watches (void) {
    while ((lex_c[lex_i] == ' ') || (lex_c[lex_i] == '\t') || (lex_c[lex_i] == '\n'))
        lex_i++;
    if ((lex_c[lex_i+0] == 's') && \
        (lex_c[lex_i+1] == 'c') && \
        (lex_c[lex_i+2] == 'h') && \
        (lex_c[lex_i+3] == 'a') && \
        (lex_c[lex_i+4] == 'u') && \
        (lex_c[lex_i+5] == 't') ) {
        lex_i += 6;
        return 1;
    }
    else 
        return 0;
}

int verb () {
    int retval;
    
    if(walks() == 0) {
        if(speaks() == 0) {
            if(hates() == 0) {
                if(watches() == 0) {
                    if(hears() == 0) {
                        printf("Sorry my german is not so good - but maybe the verb is wrong!");
                        exit(1);
                    }
                }
            }
        }
    }
}

int subject () {
    int retval;
    
    if(car() == 0) {
        if(house() == 0) {
            if(caesar() == 0) {
                if(tree() == 0) {
                    if(computer() == 0) {
                        printf("Sorry my german is not so good - but maybe the subject is wrong!");
                        exit(1);
                    }
                }
            }
        }
    }
}

int sentence () {
    subject();
    verb();
}


int text () {
    sentence();
    dot();
    if (lex_i == (lex_n-2))
        printf("Good text");
    else
        text();
}



int main(int argc, char *argv[]) {
    FILE *fp;
    
    if((fp = fopen(argv[1], "r")) == NULL) {
        perror("Can't open file");
        exit(1);
    }
    while (!feof(fp)) 
        lex_c[lex_i++] = fgetc(fp);
    lex_n = lex_i;
    lex_i = 0;
    
    text();

    fclose(fp);

return 0;
}