10 static struct treenode *_new_plain(int op)
12 struct treenode *new = (TREECAST) malloc(TREESIZE);
14 new->kids[0] = new->kids[1] = TREENULL;
15 new->parent = TREENULL;
17 new->name = new->reg = (char *)NULL;
18 new->val = new->paramges = new->vars = 0;
19 new->param_index = -1;
23 struct treenode *new_nothing(void)
25 return new_node(O_NOTHING, TREENULL, TREENULL);
28 struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
30 struct treenode *new = TREENULL;
33 fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]);
35 if(op == O_SUB && l != TREENULL && r != TREENULL && l->op == O_NUM && r->op == O_NUM) {
36 new = new_number(l->val - r->val);
43 new->name = (char *)NULL;
47 struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index)
49 struct treenode *new = new_node(op, l, r);
52 fprintf(stderr, "new_param: %i (index)\n", param_index);
54 new->param_index = param_index;
59 struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset)
61 struct treenode *new = new_node(O_FIELD, l, r);
64 fprintf(stderr, "new_field: %i (soffset)\n", soffset);
66 new->soffset = soffset;
71 struct treenode *new_arg(struct treenode *l, struct treenode *r, int soffset)
73 struct treenode *new = new_node(O_ARG, l, r);
76 fprintf(stderr, "new_arg: %i (soffset)\n", soffset);
78 new->soffset = soffset;
79 new->name = (char *) malloc(10);
80 sprintf(new->name, "%i", soffset);
84 struct treenode *new_call(char *name, struct treenode *l, struct treenode *r, int paramges, int vars)
86 struct treenode *new = new_node(O_CALL, l, r);
89 fprintf(stderr, "new_call\n");
92 new->paramges = paramges;
97 struct treenode *new_number(long val)
100 /* TODO: maximal groesse? */
102 char *t = (char*) malloc(BUFMAX);
105 new = _new_plain(O_NULL);
106 } else if(val == -1) {
107 new = _new_plain(O_MONE);
108 } else if(val == -2) {
109 new = _new_plain(O_MTWO);
110 } else if(val == -4) {
111 new = _new_plain(O_MFOUR);
112 } else if(val == -8) {
113 new = _new_plain(O_MEIGHT);
115 new = _new_plain(O_NUM);
119 fprintf(stderr, "new_number: %i\n", val);
122 memset(t, 0, BUFMAX);
123 sprintf(t, "%li", val);
129 static void write_indent(int i)
132 for(a = 0; a < i; a++) {
133 fprintf(stderr, "| ");
137 void write_tree(struct treenode *node, int indent)
139 if(node == TREENULL) return;
140 write_indent(indent);
141 fprintf(stderr, "%s @ %%%s. \"%s\"\n", o_names[node->op], node->reg, node->name == (char*) NULL ? "" : node->name);
142 if(node->kids[0] != TREENULL) {
143 write_tree(node->kids[0], indent+1);
145 if(node->kids[1] != TREENULL) {
146 write_tree(node->kids[1], indent+1);
150 void just_calls(struct treenode *node)
152 if(node == TREENULL) {
154 } else if(node->op == O_CALL) {
155 write_tree(node, 0); burm_label(node); burm_reduce(node, 1);
157 just_calls(node->kids[0]);
158 just_calls(node->kids[1]);