/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/pascal-compiler/diff/diff04.c


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

int is_id(char *);
int is_plus(char *);
int is_mult(char *);
int is_minus(char *);
int is_div(char *);
int is_pow(char *);
int is_diff(char *);
int is_open_round_bracked(char *);
int is_closed_round_bracked(char *);
int is_num(char *);
int is_id(char *str) {return ((str[0] >= 'a') && (str[0] <= 'z') && (str[1] == 0));}
int is_plus(char *str) {return ((str[0] == '+') && (str[1] == 0));}
int is_minus(char *str) {return ((str[0] == '-') && (str[1] == 0));}
int is_mult(char *str) {return ((str[0] == '*') && (str[1] == 0));}
int is_div(char *str) {return ((str[0] == '/') && (str[1] == 0));}
int is_pow(char *str) {return ((str[0] == '^') && (str[1] == 0));}
int is_diff(char *str) {return ((str[0] == '\'') && (str[1] == 0));} 
int is_open_round_bracked(char *str) {return ((str[0] == '(') && (str[1] == 0));}
int is_closed_round_bracked(char *str) {return ((str[0] == ')') && (str[1] == 0));}

int is_num(char *str) {
    int flag = 1;
    int i;
        
    for(i = 0;  str[i] != 0;  i++)
        if(!((str[i] >= '0') && (str[i] <= '9')))
            flag = 0;
return flag;
}


char buf[1024*1024];
char tmp_str[256];
int  buf_i = 0;
int  buf_len;

char stack[128][128];
int stack_ptr = 0;

void push(char *str) {
    strcpy(stack[stack_ptr], str);
    stack_ptr++;
return;
}

void pop(char *str) {
    stack_ptr--;
    strcpy(str, stack[stack_ptr]);
return;
}

int expr_next_var_name_i = 1;




int lex_get_token_from_stream(char *str) {
    int i;
    int ch;
    
    if(buf_i == buf_len)
        return 0;
    
    ch = buf[buf_i];
    i = 0;

    if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i ) < buf_len)) {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        while ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i) < buf_len)) {
            str[i] = ch;
            i++;
            ch = buf[buf_i + i];
        }
        str[i] = 0;
    }
    else if ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        while ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
            str[i] = ch;
            i++;
            ch = buf[buf_i + i];
        }
        str[i] = 0;
    }
    else if(ch == '=') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '!') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '<') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '>') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == ':') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + i];
        if(ch == '=')  {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '.') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + 1];
        if(ch == '.') {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }
    else if(ch == '^') {
        str[i] = ch;
        i++;
        ch = buf[buf_i + 1];
        if(ch == '^') {
            str[i] = ch;
            i++;
        }
        str[i] = 0;
    }

    else {
        str[i] = ch;
        i++;
        str[i] = 0;
    }
    return i;
}

int lex_get_token_from_stream_ws(char *str) {
    int i;
    
    i = lex_get_token_from_stream(str);
    while (((str[0] == '\n') || (str[0] == '\t') || (str[0] == '\r') || (str[0] == ' ')) && ((buf_i + i) < buf_len)) {
        buf_i += i;
        i = lex_get_token_from_stream(str);
        if(i == 0)
            return 0;
    }
return i;
}

int epsilon(void) {
  return 1;
}

int po(void);
int pow2(void);
int numexpr(void);
int numexpr2(void);
int term(void);
int term2(void);
int factor (void);
int id (void);


int id (void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if (is_id(str)) {
        buf_i += buf_j;
        retval = 1;
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return retval;
}



int po(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    
    retval = numexpr();
    if (retval) {
        retval = pow2 ();
        if(retval);
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval);
}

int pow2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];

    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    printf("%s\n", str);
    if (is_pow(str)) {
        buf_i += buf_j;
        retval = numexpr ();
        pop(tmp_str2);
        pop(tmp_str3);
        sprintf(tmp_str4, "%s ^ %s", tmp_str2, tmp_str3);
        push(tmp_str4);
        if(retval) {
           retval = pow2 ();
           if(retval);
           else {
               buf_i = buf_i_start;
               retval = 0;
           }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else if (retval = epsilon());
    
return retval;
}



int numexpr(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    
    retval = term();
    if (retval) {
        retval = numexpr2 ();
        if(retval);
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval);
}

int numexpr2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];

    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_plus(str)) {
        buf_i += buf_j;
        retval = term ();
        pop(tmp_str2);
        pop(tmp_str3);
        sprintf(tmp_str4, "(%s + %s)", tmp_str2, tmp_str3);
        printf("%s\n", tmp_str4);
        push(tmp_str4);
        if(retval) {
           retval = numexpr2 ();
           if(retval);
           else {
               buf_i = buf_i_start;
               retval = 0;
           }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else if (retval = epsilon());
    
return retval;
}


int term(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    
    buf_i_start = buf_i;
    
    retval = factor();
    if (retval) {
        retval = term2 ();
        if(retval);
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return (retval);
}

int term2(void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];

    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_mult(str)) {
        buf_i += buf_j;
        retval = factor ();
        pop(tmp_str2);
        pop(tmp_str3);
        sprintf(tmp_str4, "(%s * %s)", tmp_str2, tmp_str3);
        printf("%s\n", tmp_str4);
        push(tmp_str4);
        
        if(retval) {
           retval = term2 ();
           if(retval);
           else {
               buf_i = buf_i_start;
               retval = 0;
           }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else if (retval = epsilon());
    
return (retval);
}


int factor (void) {
    char str[256];
    int buf_i_start;
    int retval = 1;
    int buf_j;
    char tmp_str[128];
    char tmp_str2[128];
    char tmp_str3[128];
    char tmp_str4[128];
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_id(str)) {
        buf_i += buf_j;
        retval = 1;
        push(str);
    }
    else if (is_open_round_bracked(str)) {
        buf_i += buf_j;
        if (retval = po()) {
            buf_j = lex_get_token_from_stream_ws(str);
            if (is_closed_round_bracked(str)) {
                buf_i += buf_j;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else if (is_num(str)) {
        buf_i += buf_j;
        retval = 1;
        push(str);
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }

return retval;
}


void get_buf(FILE *fp) {
    int i;
    i = 0;
    while(!feof(fp)) {
        buf[i] = fgetc(fp);
        i++;
    }
    buf_len = i - 1;
return;
}

int main(int argc, char *argv[]) {
    FILE *fp;
    char str[256];
    
    if((fp = fopen(argv[1], "r")) == NULL) {
        perror("Can't open file!");
        return -1;
    }
    get_buf(fp);

    
    if(numexpr())
        fprintf(stderr, "\n\n\nDer Code enthaelt keine Fehler - NO ERROR!!!\n");
    else
        fprintf(stderr, "\n\n\nDer Code enthaelt einen Fehler - ERROR!!!\n");
    fclose(fp);
    
return 0;    
}