meillo@2: #include meillo@2: #include meillo@2: #include meillo@2: #include "baum.h" meillo@2: meillo@26: unsigned char action_print(struct Node* node); meillo@26: unsigned char action_sum(struct Node* node); meillo@26: unsigned char action_number(struct Node* node); meillo@51: unsigned char action_create(struct Node* node); meillo@26: unsigned char action_times(struct Node* node); meillo@50: unsigned char action_if(struct Node* node); meillo@50: unsigned char action_while(struct Node* node); meillo@26: meillo@57: struct action { meillo@57: char* name; meillo@57: unsigned char (*func)(struct Node* node); meillo@57: }; meillo@57: meillo@57: struct action actions[] = { meillo@57: {"print", action_print}, meillo@57: {"sum", action_sum}, meillo@57: {"number", action_number}, meillo@57: {"create", action_create}, meillo@57: {"times", action_times}, meillo@57: {"if", action_if}, meillo@57: {"while", action_while}, meillo@57: }; meillo@57: meillo@26: meillo@2: meillo@3: unsigned char action(struct Node* node) { meillo@57: int i; meillo@57: meillo@5: if (node == NULL) { meillo@38: if (option_verbose) { meillo@38: fprintf(stderr, "warning: action of non existing node\n"); meillo@38: } meillo@5: return 0; meillo@5: } meillo@5: meillo@57: for (i = 0; i < (sizeof(actions)/sizeof(actions[0])); i++) { meillo@57: if (strcmp(actions[i].name, node->name) == 0) { meillo@57: return (actions[i].func)(node); meillo@57: } meillo@57: } meillo@3: meillo@31: fprintf(stderr, "unknown kind of node\n"); meillo@16: exit(4); meillo@2: } meillo@2: meillo@2: meillo@2: meillo@3: unsigned char action_print(struct Node* node) { meillo@5: unsigned char result; meillo@5: result = action(node->down); meillo@5: if (node->value == 'c') { meillo@5: printf("%c", result); meillo@5: } else { meillo@5: printf("%d", result); meillo@5: } meillo@5: return result; meillo@2: } meillo@2: meillo@2: meillo@3: unsigned char action_sum(struct Node* node) { meillo@2: struct Node* tp; meillo@53: meillo@53: node->value = 0; meillo@55: for (tp = node->down; tp != NULL; tp = tp->right) { meillo@2: node->value += action(tp); meillo@2: } meillo@2: return node->value; meillo@2: } meillo@2: meillo@2: meillo@3: unsigned char action_number(struct Node* node) { meillo@38: if (node->down != NULL) { meillo@38: action(node->down); meillo@38: } meillo@2: return node->value; meillo@2: } meillo@2: meillo@3: meillo@51: unsigned char action_create(struct Node* node) { meillo@5: int input; meillo@51: meillo@51: if (node->down == NULL) { meillo@51: /* user input */ meillo@51: printf("input: "); meillo@51: scanf("%d", &input); meillo@51: input = input % 256; meillo@51: } else { meillo@51: /* return value */ meillo@51: input = action(node->down); meillo@51: } meillo@5: insertLast(node, newNode("number", (char) input)); meillo@3: return 0; meillo@3: } meillo@3: meillo@3: meillo@5: unsigned char action_times(struct Node* node) { meillo@5: unsigned char i; meillo@55: meillo@10: for (i = 0; i < node->value; i++) { meillo@46: insertLast(node, copyTree(node->down)); meillo@5: } meillo@5: return 0; meillo@5: } meillo@50: meillo@50: meillo@50: unsigned char action_if(struct Node* node) { meillo@50: int result = 0; meillo@50: char return1; meillo@50: char return2; meillo@50: meillo@50: if (node->down == NULL || node->down->right == NULL) { meillo@50: fprintf(stderr, "error: while requires two sons"); meillo@52: exit(7); meillo@50: } meillo@50: meillo@50: return1 = action(node->down); meillo@50: return2 = action(node->down->right); meillo@50: meillo@50: if (node->value == '!') { /* 33 */ meillo@50: if (return1 != return2) { meillo@50: result = 1; meillo@50: } meillo@50: } else if (node->value == '<') { /* 60 */ meillo@50: if (return1 < return2) { meillo@50: result = 1; meillo@50: } meillo@50: } else if (node->value == '>') { /* 62 */ meillo@50: if (return1 > return2) { meillo@50: result = 1; meillo@50: } meillo@50: } else { meillo@50: if (return1 == return2) { meillo@50: result = 1; meillo@50: } meillo@50: } meillo@50: return result; meillo@50: } meillo@50: meillo@50: meillo@50: unsigned char action_while(struct Node* node) { meillo@50: if (node->down == NULL || node->down->right == NULL) { meillo@50: fprintf(stderr, "error: while requires two sons"); meillo@52: exit(7); meillo@50: } meillo@50: while (action(node->down)) { meillo@50: action(node->down->right); meillo@50: } meillo@50: return 0; meillo@50: }