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;
}