doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / gesamt / .svn / text-base / tree.c.svn-base
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #include "tree.h"
5 #include "code_gen.h"
6
7 /* new_node: create "standard node" with one or two children and
8  * given operation
9  */
10 treenode *new_node(int op, treenode *left, treenode *right) {
11         treenode *new=(treenode *)malloc(sizeof(treenode));
12
13 #ifdef DEBUG
14         printf("new_node: %i (%s)\n",op,rule_names[op]);
15 #endif
16
17         new->kids[0]=left;
18         new->kids[1]=right;
19         new->op=op;
20         new->name=(char *)NULL;
21
22         return new;
23 }
24
25 /* new_node_value: create "standard node" with one or two children and
26  * given operation and the given value
27  */
28 treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param) {
29         treenode *new=(treenode *)malloc(sizeof(treenode));
30
31 #ifdef DEBUG
32         printf("new_node: %i (%s)\n",op,rule_names[op]);
33 #endif
34
35         new->kids[0]=left;
36         new->kids[1]=right;
37         new->op=op;
38         new->name=(char *)NULL;
39         new->value=value;
40         new->param_index=param;
41
42         return new;
43 }
44
45 /* new_leaf: create leaf - node with no children */
46 treenode *new_leaf(int op) {
47         treenode *new=(treenode *)malloc(sizeof(treenode));
48         
49 #ifdef DEBUG
50         printf("new_leaf: %i (%s)\n",op,rule_names[op]);
51 #endif
52
53         new->kids[0]=(treenode *)NULL;
54         new->kids[1]=(treenode *)NULL;
55         new->op=op;
56         new->name=(char *)NULL;
57
58         return new;
59 }
60
61 /* new_named_leaf: create leaf with name (used for identifier or
62  * value of number)
63  */
64 treenode *new_named_leaf(int op, char *name) {
65         treenode *new=(treenode *)malloc(sizeof(treenode));
66         
67 #ifdef DEBUG
68         printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
69 #endif
70
71         new->kids[0]=(treenode *)NULL;
72         new->kids[1]=(treenode *)NULL;
73         new->op=op;
74         new->name=name;
75
76         return new;
77 }
78
79 /* new_named_leaf_value: create leaf with name (used for identifier or
80  * value of number)
81  */
82 treenode *new_named_leaf_value(int op, char *name, long value, int param) {
83         treenode *new=(treenode *)malloc(sizeof(treenode));
84         
85 #ifdef DEBUG
86         printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
87 #endif
88
89         new->kids[0]=(treenode *)NULL;
90         new->kids[1]=(treenode *)NULL;
91         new->op=op;
92         new->name=name;
93         new->value=value;
94         new->param_index=param;
95
96         return new;
97 }
98
99 /* new_named_node: create node with one or two children and a name (can be
100  * used for storing a procedure's name)
101  */
102 treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
103         treenode *new=(treenode *)malloc(sizeof(treenode));
104         
105 #ifdef DEBUG
106         printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
107 #endif
108         
109         new->kids[0]=left;
110         new->kids[1]=right;
111         new->op=op;
112         new->name=name;
113
114         return new;
115 }
116
117 void write_indent(int indent) {
118         int a;
119         for(a=0;a<indent;a++) {
120                 printf("|");
121         }
122 }
123
124 /* write_tree: display the tree generated by the attributed grammar; this tree willk
125  * be traversed by iburg
126  */
127 void write_tree(treenode *node, int indent) {
128         write_indent(indent);
129         printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
130         if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
131                 if(node->kids[0]!=(treenode *)NULL) {
132                         write_tree(node->kids[0], indent+1);
133                 }
134                 if(node->kids[1]!=(treenode *)NULL) {
135                         write_tree(node->kids[1], indent+1);
136                 }
137         }
138 }
139
140 treenode *new_number_leaf(long value) {
141         treenode *node;
142
143         if(value==0) {
144                 node=new_leaf(OP_Zero);
145         }
146         else if(value==1) {
147                 node=new_leaf(OP_One);
148         }
149         else {
150                 node=new_leaf(OP_Number);
151         }
152
153         node->value=value;
154
155         return node;
156 }
157