meillo@0: /* meillo@0: * baum - an esoteric programming language meillo@0: * meillo@0: * (c) markus schnalke meillo@0: * and julian forster meillo@0: * meillo@0: */ meillo@0: meillo@0: meillo@0: #include meillo@0: #include meillo@1: #include meillo@0: meillo@1: #include "baum.h" meillo@0: meillo@1: char action(struct Node* node); meillo@0: meillo@0: struct Node* root; meillo@0: meillo@0: meillo@1: void logit(char* text) { meillo@1: fprintf(stderr, "[%s]\n", text); meillo@1: } meillo@1: meillo@1: meillo@1: /* new */ meillo@0: struct Node* newNode(char* name) { meillo@0: struct Node* node; meillo@0: node = (struct Node*) malloc(sizeof(struct Node)); meillo@0: node->name = name; meillo@0: node->value = 0; meillo@0: node->right = 0; meillo@0: node->down = 0; meillo@0: return node; meillo@0: } meillo@0: meillo@0: meillo@1: /* delete */ meillo@1: void delete(struct Node* node) { meillo@0: if (node->down != NULL) { meillo@1: delete(node->down); meillo@0: } meillo@0: if (node->right != NULL) { meillo@1: delete(node->right); meillo@0: } meillo@0: free(node); node=0; meillo@0: } meillo@0: meillo@1: meillo@1: /* print */ meillo@0: void printNode(struct Node* node) { meillo@0: printf("Node: %20s (%c)\n", node->name, node->value); meillo@0: } meillo@0: meillo@0: void printTree(struct Node* root) { meillo@0: printNode(root); meillo@1: printf(" down: "); meillo@0: if (root->down != NULL) { meillo@0: printTree(root->down); meillo@1: } else { meillo@1: printf("NULL\n"); meillo@0: } meillo@1: printf(" right: "); meillo@0: if (root->right != NULL) { meillo@0: printTree(root->right); meillo@1: } else { meillo@1: printf("NULL\n"); meillo@0: } meillo@0: } meillo@0: meillo@0: meillo@1: char action_print(struct Node* node) { meillo@1: printf("%c\n", action(node->down)); meillo@1: return 0; meillo@1: } meillo@1: meillo@1: char action_sum(struct Node* node) { meillo@1: struct Node* tp; meillo@1: tp = node->down; meillo@1: while (tp != NULL) { meillo@1: node->value += action(tp); meillo@1: tp = tp->right; meillo@1: } meillo@1: return node->value; meillo@1: } meillo@1: meillo@1: char action_number(struct Node* node) { meillo@1: return node->value; meillo@1: } meillo@1: meillo@1: char action(struct Node* node) { meillo@1: if (strcmp(node->name, "print") == 0) { meillo@1: logit("print-node"); meillo@1: return action_print(node); meillo@1: } else if (strcmp(node->name, "sum") == 0) { meillo@1: logit("sum-node"); meillo@1: return action_sum(node); meillo@1: } else if (strcmp(node->name, "number") == 0) { meillo@1: logit("number-node"); meillo@1: return action_number(node); meillo@1: } else { meillo@1: fprintf(stderr, "unknown kind of node"); meillo@1: exit(1); meillo@1: } meillo@1: } meillo@1: meillo@1: meillo@1: meillo@1: /* traverse */ meillo@1: void traverse(struct Node* root) { meillo@1: /* each node controlls the nodes below itself */ meillo@1: action(root); meillo@1: } meillo@1: meillo@1: /* init */ meillo@1: void init() { meillo@1: root = newNode("print"); meillo@1: root->down = newNode("number"); meillo@1: root->down = newNode("sum"); meillo@1: root->down->down = newNode("number"); meillo@1: root->down->down->value = 70; /* 'F' */ meillo@1: root->down->down->right = newNode("number"); meillo@1: root->down->down->right->value = 50; /* '2' */ meillo@1: /* result should be 'x' */ meillo@1: } meillo@1: meillo@1: meillo@1: /* main */ meillo@0: int main(int argc, char* argv[]) { meillo@0: init(); meillo@0: printTree(root); meillo@1: meillo@1: action(root); meillo@1: meillo@1: delete(root); meillo@0: meillo@0: return(0); meillo@0: }