struct bin_tree {
struct bin_tree *next;
struct bin_tree *sub;
int id;
};
struct bin_tree *root;
int create_name(char *str) {
namespace_id++;
if(namespace_id < NAME_N_MAX)
strcpy(name_table[namespace_id], str);
else {
printf("I'm sorry too much names in use\n");
return 0;
}
return 1;
}
int functionheading(void) {
char str[256];
int buf_i_start;
int retval;
int buf_j;
/*
* <functionsheading> ::= function <functionid> <parameterlist> : <resulttype>;
*/
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if(is_function(str)) {
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if(is_var_name(str)) {
/* So an dieser Stelle muss die Tabelle fuer die Namen her */
if(create_name(str) != 0) {
buf_i += buf_j;
if(parameter_list()) {
buf_j = lex_get_token_from_stream_ws(str);
if(is_colon(str)) {
buf_i += buf_j;
if(result_type()) {
buf_j = lex_get_token_from_stream_ws(str);
if(is_semicolon(str)) {
retval = 1;
buf_i += buf_j;
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int func_type_set(char *str) {
return 1;
}
int procedureheading(void) {
char str[256];
int buf_i_start;
int retval;
int buf_j;
/*
* <procedureheading> ::= procedure <procedureid> <procedureparameterlist>;
*/
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if(is_procedure(str)) {
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if(is_var_name(str)) {
if(create_name(str) != 0) {
buf_i += buf_j;
if(procedure_parameter_list()) {
if(func_type_set("procedure") != 0) {
buf_j = lex_get_token_from_stream_ws(str);
if(is_semicolon(str)) {
retval = 1;
buf_i += buf_j;
}
else {
retval = 0;
buf_i += buf_j;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int var_definition_part(void);
int functiondeclarationpart(void);
int functiondefinition(void) {
int buf_i_start;
int retv;
/*
*functiondefinition ::= functionheading; block;
*functionheading ::=
*
*
**/
buf_i_start = buf_i;
retv = functionheading();
if(retv == 0) {
buf_i = buf_i_start;
}
else {
if(type_declaration_part()) {
retv = 1;
}
if(var_definition_part()) {
retv = 1;
}
if(functiondeclarationpart()) {
retv = 1;
}
retv = block();
if(retv == 0)
buf_i = buf_i_start;
}
return retv;
}
struct bin_tree *definition_part() {
struct bin_tree *retval = NULL;
if((retval = type_declaration_part()) != NULL) {
if((retval->next = var_definition_part()) != NULL) {
retval->next->next = functiondeclarationpart();
}
else {
retval->next = functiondeclartionpart();
}
}
else if((retval = var_definition_part()) != NULL) {
retval->next = functiondeclarationpart();
}
else if((retval = functiondeclarationpart()) != NULL);
return retval;
}
struct bin_tree *proceduredefinition(void) {
int buf_i_start;
int retv;
struct bin_tree *retval;
/*
*functiondefinition ::= functionheading; block;
*functionheading ::=
*
*
**/
buf_i_start = buf_i;
retv = procedureheading();
if(retv == 0) {
buf_i = buf_i_start;
}
else {
if((retval = (struct bin_tree *)malloc(sizeof(struct bin_tree))) == NULL) {
perror("Not enough memory");
exit(1);
}
retval->id = namespace_id;
retval->next = NULL;
retval->sub = definition_part();
retv = block();
if(retv == 0)
buf_i = buf_i_start;
}
return retval;
}
struct bin_tree *functiondeclarationpart(void) {
int buf_i_start;
struct bin_tree *retval;
struct bin_tree *r1;
struct bin_tree *r2;
buf_i_start = buf_i;
r1 = functiondefinition();
r2 = proceduredefinition();
if(r1 != NULL)
retval = r1;
if(r2 != NULL)
retval = r2;
if(retval != NULL)
retval->next = functiondeclarationpart();
else {
buf_i = buf_i_start;
retval = NULL;
}
return retval;
}
int var_type_set(char *str) {
return 1;
}
struct bin_tree *vardefinition(void) {
int buf_i_start;
int buf_j;
struct bin_tree *retval;
char str[256];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if(is_var_name(str)) {
if(create_name(str) != 0) {
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if(is_colon(str)) {
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if(is_var_name(str)) {
if(var_type_set(str)) {
buf_i += buf_j;
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");
exit(1);
}
retval->next = NULL;
retval->sub = NULL;
retval->id = namespace_id;
}
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;
}
}
else {
buf_i = buf_i_start;
retval = NULL;
}
}
else {
buf_i = buf_i_start;
retval = NULL;
}
return retval;
}
struct bin_tree *vardefinitionpart(void) {
int buf_i_start;
struct bin_tree *retval = NULL;
buf_i_start = buf_i;
if((retval = vardefinition()) != NULL)
retval->next = vardefinitionpart();
else {
retval = NULL;
buf_i = buf_i_start;
}
return retval;
}
int var_definition_part(void) {
char str[256];
int buf_j;
int buf_i_start;
int retval;
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if(is_var_procedure_attribute(str)) {
buf_i += buf_j;
if(vardefinitionpart()) {
retval = 1;
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int main(void) {
if((head = (struct lin_list *)malloc(sizeof(struct lin_list))) == NULL) {
perror("Not enough memory!");
exit(1);
}
head->id = 0;
head->next = NULL;
}