doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / codea / .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) {
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
41         return new;
42 }
43
44 /* new_leaf: create leaf - node with no children */
45 treenode *new_leaf(int op) {
46         treenode *new=(treenode *)malloc(sizeof(treenode));
47         
48 #ifdef DEBUG
49         printf("new_leaf: %i (%s)\n",op,rule_names[op]);
50 #endif
51
52         new->kids[0]=(treenode *)NULL;
53         new->kids[1]=(treenode *)NULL;
54         new->op=op;
55         new->name=(char *)NULL;
56
57         return new;
58 }
59
60 /* new_named_leaf: create leaf with name (used for identifier or
61  * value of number)
62  */
63 treenode *new_named_leaf(int op, char *name) {
64         treenode *new=(treenode *)malloc(sizeof(treenode));
65         
66 #ifdef DEBUG
67         printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
68 #endif
69
70         new->kids[0]=(treenode *)NULL;
71         new->kids[1]=(treenode *)NULL;
72         new->op=op;
73         new->name=name;
74
75         return new;
76 }
77
78 /* new_named_leaf_value: create leaf with name (used for identifier or
79  * value of number)
80  */
81 treenode *new_named_leaf_value(int op, char *name, long value) {
82         treenode *new=(treenode *)malloc(sizeof(treenode));
83         
84 #ifdef DEBUG
85         printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
86 #endif
87
88         new->kids[0]=(treenode *)NULL;
89         new->kids[1]=(treenode *)NULL;
90         new->op=op;
91         new->name=name;
92         new->value=value;
93
94         return new;
95 }
96
97 /* new_named_node: create node with one or two children and a name (can be
98  * used for storing a procedure's name)
99  */
100 treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
101         treenode *new=(treenode *)malloc(sizeof(treenode));
102         
103 #ifdef DEBUG
104         printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
105 #endif
106         
107         new->kids[0]=left;
108         new->kids[1]=right;
109         new->op=op;
110         new->name=name;
111
112         return new;
113 }
114
115 void write_indent(int indent) {
116         int a;
117         for(a=0;a<indent;a++) {
118                 printf("|");
119         }
120 }
121
122 /* write_tree: display the tree generated by the attributed grammar; this tree willk
123  * be traversed by iburg
124  */
125 void write_tree(treenode *node, int indent) {
126         write_indent(indent);
127         printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
128         if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
129                 if(node->kids[0]!=(treenode *)NULL) {
130                         write_tree(node->kids[0], indent+1);
131                 }
132                 if(node->kids[1]!=(treenode *)NULL) {
133                         write_tree(node->kids[1], indent+1);
134                 }
135         }
136 }
137
138 treenode *new_number_leaf(long value) {
139         treenode *node;
140
141         if(value==0) {
142                 node=new_leaf(OP_Zero);
143         }
144         else if(value==1) {
145                 node=new_leaf(OP_One);
146         }
147         else {
148                 node=new_leaf(OP_Number);
149         }
150
151         node->value=value;
152
153         return node;
154 }
155