/media/sda-magnetic/david/Dok-15-2023-11-27/fernuni-hagen/cs-i-ii/old-cs-2-03/pascal-compiler/2020-01-29-with-tree/pascal103between.c


int is_dot(char *str) {return ((str[0] == '.') && (str[1] == 0));}
int is_two_dot(char *str) {return ((str[0] == '.') && (str[1] == '.') && (str[2] == 0));}
int is_type(char *str) {return ((str[0] == 't') && (str[1] == 'y') && (str[2] == 'p') && (str[3] == 'e') && (str[4] == 0));}  
int is_equal(char *str) {return ((str[0] == '=') && (str[1] == 0));}


int standardsimpletype(void) {
    int buf_i_start;
    int buf_j;
    char str[256];
    int retval = 0;
    
    buf_i_start = buf_i;
    
    buf_j = lex_get_token_from_stream_ws(str);
    if(strcmp(str, "integer") == 0) {
        buf_i += buf_j;
        retval = 1;
    }
    else if(strcmp(str, "real") == 0) {
        buf_i += buf_j;
        retval = 1;
    }
    else if(strcmp(str, "boolean") == 0) {
        buf_i += buf_j;
        retval = 1;
    }
    else if(strcmp(str, "char") == 0) {
        buf_i += buf_j;
        retval = 1;
    }
    else if(strcmp(str, "string") == 0) {
        buf_i += buf_j;
        retval = 1;
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }
return retval;
}

int subrangetype(void) {
    int buf_i_start;
    int buf_j;
    int retval;
    char str[256];
    
    buf_i_start = buf_i;
    
    buf_j = lex_get_token_from_stream_ws(str);
    if(is_var_name(str)) {
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if(is_two_dot(str)) {
            buf_i += buf_j;
            buf_j = lex_get_token_from_stream_ws(str);
            if(is_var_name(str)) {
                buf_i += buf_j;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
        
    }
    else {
        retval = 0;
        buf_i = buf_i_start;
    }
    
return retval;
}

int enum_element_chain(void) {
    int buf_i_start;
    int buf_j;
    int retval;
    char str[256];
    
    buf_i_start = buf_i;
    
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_var_name(str)) {
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if (is_comma(str)) {
            buf_i += buf_j;
            retval = (retval && enum_element_chain());
        }
        else {
            retval = 1;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }
    
return retval;
}

int enumtype(void) {
    int buf_i_start;
    int buf_j;
    int retval;
    char str[256];
    
    buf_i_start = buf_i;
    
    buf_j = lex_get_token_from_stream_ws(str);
    if (is_opening_round_bracket(str)) {
        buf_i += buf_j;
        if (enum_element_chain()) {
            buf_j = lex_get_token_from_stream_ws(str);
            if (is_close_round_bracket(str)) {
                buf_i += buf_j;
                retval = 1;
            }
            else {
                buf_i = buf_i_start;
                retval = 0;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = 0;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = 0;
    }
    
return retval;
}

struct bin_tree *standardsimpletypedefinition(void) {
    int buf_i_start;
    int buf_j;
    char str[256];
    struct bin_tree *retval;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if(is_var_name(str)) {
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if(is_equal(str)) {
            buf_i += buf_j;
            if (standardsimpletype()) {
                buf_j = lex_get_token_from_stream_ws(str);
                if (is_semicolon(str)) {
                    buf_i += buf_j;
                    if((retval = (struct bin_tree *)malloc(sizeof(struct bin_tree))) == NULL) {
                        perror ("Not enough memory\n");
                        exit(1);
                    }
                    retval->id = namespace_id;
                    retval->next = NULL;
                    retval->sub = NULL;
                }
                else {
                    buf_i = buf_i_start;
                    retval = NULL;
                }
            }
            else {
                buf_i = buf_i_start;
                retval = NULL;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = NULL;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = NULL;
    }
    
return retval;
}

struct bin_tree *subrangetypedefinition(void) {
    int buf_i_start;
    int buf_j;
    char str[256];
    struct bin_tree  *retval;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if(is_var_name(str)) {
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if(is_equal(str)) {
            buf_i += buf_j;
            if (subrangetype()) {
                buf_j = lex_get_token_from_stream_ws(str);
                if (is_semicolon(str)) {
                    buf_i += buf_j;
                    if((retval = (struct bin_tree *)malloc(sizeof(struct bin_tree))) == NULL) {
                        perror ("Not enough memory\n");
                        exit(1);
                    }
                    retval->id = namespace_id;
                    retval->next = NULL;
                    retval->sub = NULL;                    
                }
                else {
                    buf_i = buf_i_start;
                    retval = NULL;
                }
            }
            else {
                buf_i = buf_i_start;
                retval = NULL;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = NULL;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = NULL;
    }
    
return retval;    
}

struct bin_tree *enumtypedefinition(void) {
    int buf_i_start;
    int buf_j;
    char str[256];
    struct bin_tree *retval;
    
    buf_i_start = buf_i;
    buf_j = lex_get_token_from_stream_ws(str);
    
    if(is_var_name(str)) {
        buf_i += buf_j;
        buf_j = lex_get_token_from_stream_ws(str);
        if(is_equal(str)) {
            buf_i += buf_j;
            if (enumtype()) {
                buf_j = lex_get_token_from_stream_ws(str);
                if (is_semicolon(str)) {
                    buf_i += buf_j;
                    if((retval = (struct bin_tree *)malloc(sizeof(struct bin_tree))) == NULL) {
                        perror ("Not enough memory\n");
                        exit(1);
                    }
                    retval->id = namespace_id;
                    retval->next = NULL;
                    retval->sub = NULL;
                }
                else {
                    buf_i = buf_i_start;
                    retval = NULL;
                }
            }
            else {
                buf_i = buf_i_start;
                retval = NULL;
            }
        }
        else {
            buf_i = buf_i_start;
            retval = NULL;
        }
    }
    else {
        buf_i = buf_i_start;
        retval = NULL;
    }
    
return retval;
}

struct bin_tree *type_definition(void) {
    int retval = 0;
    int buf_i_start;
    struct bin_tree *retval;
    
    buf_i_start = buf_i;
    
    buf_j = lex_get_token_from_stream_ws(str);
    if(is_type(str)) {
        buf_i += buf_j;
        if((retval = standardsimpletypedefinition()) != NULL);
        else if((retval = subrangetypedefinition()) != NULL);
        else if((retval = enumtypedefinition()) != NULL);
        else {
            retval = NULL;
        }
    }
    
return retval;
}