1
|
1 /* Micro-C tree print routine */
|
|
2 /* $Id$ */
|
|
3
|
0
|
4 #define EXTERN /**/
|
|
5 #include "mc.h"
|
18
|
6 extern void tree_print(int e);
|
|
7 extern void tree_parse(int e);
|
0
|
8
|
|
9 typedef
|
|
10 struct tree_node {
|
|
11 int tree_type;
|
|
12 char *tree_name;
|
|
13 char *tree_args;
|
|
14 } tree_node_type;
|
|
15
|
18
|
16 static
|
0
|
17 tree_node_type tree_nodes[] = {
|
|
18 {(-1),"INT",""},
|
|
19 {(-2),"CHAR",""},
|
|
20 {(-3),"UNSIGNED",""},
|
|
21 {(-4),"POINTER","t"},
|
|
22 {(-5),"ARRAY","tv"},
|
|
23 {(-6),"STRUCT","vt"},
|
|
24 {(-7),"UNION",""},
|
|
25 {(-8),"FUNCTION","t"},
|
|
26 {(-9),"EMPTY",""},
|
|
27 {(-10),"STATIC",""},
|
|
28 {(-11),"GOTO",""},
|
|
29 {(-12),"RETURN",""},
|
|
30 {(-13),"BREAK",""},
|
|
31 {(-14),"CONTINUE",""},
|
|
32 {(-15),"IF",""},
|
|
33 {(-16),"ELSE",""},
|
|
34 {(-17),"FOR",""},
|
|
35 {(-18),"DO",""},
|
|
36 {(-19),"WHILE",""},
|
|
37 {(-20),"SWITCH",""},
|
|
38 {(-21),"CASE",""},
|
|
39 {(-22),"DEFAULT",""},
|
|
40 {(-23),"RESERVE",""},
|
|
41 {(-24),"TAG",""},
|
|
42 {(-25),"FIELD",""},
|
|
43 {(-26),"IDENT",""},
|
|
44 {(-27),"STRING",""},
|
|
45 {(-28),"MACRO",""},
|
|
46 {(-29),"BLABEL",""},
|
|
47 {(-30),"FLABEL",""},
|
|
48 {(-31),"TYPEDEF",""},
|
|
49 {(-32),"SIZEOF",""},
|
|
50 {(-33),"TYPE",""},
|
|
51 {(-34),"LONG",""},
|
|
52 {(-35),"SHORT",""},
|
|
53 {(-36),"EXTERN",""},
|
18
|
54 {(-37),"VOID",""},
|
|
55 {(-38),"REGISTER",""},
|
|
56 {(-39),"CODE",""},
|
|
57 {(-40),"ENVIRONMENT",""},
|
|
58 {(-41),"DEFINED",""},
|
37
|
59 {(-42),"KONST",""},
|
|
60 {(-43),"FMACRO",""},
|
|
61 {(-44),"LMACRO",""},
|
|
62
|
0
|
63 {1,"GVAR","vs"},
|
|
64 {2,"RGVAR","vs"},
|
|
65 {3,"CRGVAR","vs"},
|
|
66 {4,"LVAR","v"},
|
|
67 {5,"RLVAR","v"},
|
|
68 {6,"CRLVAR","v"},
|
|
69 {7,"CONST","v"},
|
|
70 {8,"FNAME","n"},
|
|
71 {9,"INDIRECT","e"},
|
|
72 {10,"RINDIRECT","e"},
|
|
73 {11,"CRINDIRECT","e"},
|
|
74 {12,"ADDRESS","e"},
|
|
75 {13,"MINUS","e"},
|
|
76 {14,"LNOT","e"},
|
|
77 {15,"BNOT","e"},
|
|
78 {16,"INC",""},
|
|
79 {17,"POSTINC","e"},
|
|
80 {18,"PREINC","e"},
|
|
81 {19,"CPOSTINC","e"},
|
|
82 {20,"CPREINC","e"},
|
|
83 {21,"DEC",""},
|
|
84 {22,"CPOSTDEC","e"},
|
|
85 {23,"CPREDEC","e"},
|
|
86 {24,"MUL","ee"},
|
|
87 {25,"UMUL","ee"},
|
|
88 {26,"DIV","ee"},
|
|
89 {27,"UDIV","ee"},
|
|
90 {28,"MOD","ee"},
|
|
91 {29,"UMOD","ee"},
|
|
92 {30,"ADD","ee"},
|
|
93 {31,"SUB","ee"},
|
|
94 {32,"RSHIFT","ee"},
|
|
95 {33,"URSHIFT","ee"},
|
|
96 {34,"LSHIFT","ee"},
|
|
97 {35,"ULSHIFT","ee"},
|
|
98 {36,"GT","ee"},
|
|
99 {37,"UGT","ee"},
|
|
100 {38,"GE","ee"},
|
|
101 {39,"UGE","ee"},
|
|
102 {40,"LT","ee"},
|
|
103 {41,"ULT","ee"},
|
|
104 {42,"LE","ee"},
|
|
105 {43,"ULE","ee"},
|
|
106 {44,"EQ","ee"},
|
|
107 {45,"NEQ","ee"},
|
|
108 {46,"BAND","ee"},
|
|
109 {47,"EOR","ee"},
|
|
110 {48,"BOR","ee"},
|
|
111 {49,"LAND","ee"},
|
|
112 {50,"LOR","ee"},
|
|
113 {51,"COND","eee"},
|
|
114 {52,"ASS","ee"},
|
|
115 {53,"CASS","ee"},
|
|
116 {54,"ASSOP","eev"},
|
|
117 {55,"CASSOP","eev"},
|
|
118 {56,"COMMA","ee"},
|
|
119 {57,"LPAR",""},
|
|
120 {58,"RPAR",""},
|
|
121 {59,"LBRA",""},
|
|
122 {60,"RBRA",""},
|
|
123 {61,"LC",""},
|
|
124 {62,"RC",""},
|
|
125 {63,"COLON","ee"},
|
|
126 {64,"SM",""},
|
|
127 {65,"PERIOD",""},
|
|
128 {66,"ARROW",""},
|
37
|
129 {67,"CNAME",""},
|
|
130 {68,"SASS",""},
|
|
131 {69,"DOTS",""},
|
0
|
132 {100,"AS",""}
|
|
133 };
|
|
134
|
18
|
135 void
|
0
|
136 tree_print(int e)
|
|
137 {
|
|
138 printf("* generate code on type:\n* ");
|
|
139 tree_parse(type);
|
|
140 printf("\n* expr:\n* ");
|
|
141 tree_parse(e);
|
|
142 printf("\n");
|
|
143 }
|
|
144
|
18
|
145 static
|
0
|
146 int tree_level;
|
|
147
|
18
|
148 void
|
0
|
149 tree_parse(int e)
|
|
150 {
|
|
151 tree_node_type *t;
|
|
152 int i,j;
|
|
153 char *s;
|
|
154
|
|
155 if(e<0) {
|
|
156 for(t=tree_nodes;t->tree_type!=100;t++) {
|
|
157 if(t->tree_type==e) {
|
|
158 for(j=0;j<tree_level;j++) putchar(' ');
|
|
159 printf("list(%s)",t->tree_name);
|
|
160 break;
|
|
161 }
|
|
162 }
|
|
163 } else {
|
|
164 i = car(e);
|
|
165 for(t=tree_nodes;t->tree_type!=100;t++) {
|
|
166 if(t->tree_type==i) {
|
|
167 tree_level++;
|
|
168 for(j=0;j<tree_level;j++) putchar(' ');
|
|
169 printf("list(%s",t->tree_name);
|
|
170 for(i=1,s=t->tree_args;*s;s++,i++) {
|
|
171 switch(*s) {
|
|
172 case 'e':
|
|
173 case 't':
|
|
174 printf(",\n*");
|
|
175 tree_parse(heap[e+i]); break;
|
|
176 case 'v':
|
|
177 printf(",%d",heap[e+i]); break;
|
|
178 case 'n':
|
|
179 printf(",%s",((NMTBL *)heap[e+i])->nm); break;
|
|
180 case 's':
|
18
|
181 printf(",%s",(char *)heap[e+i]); break;
|
0
|
182 case 'i':
|
|
183 printf(",%d",heap[e+i]); break;
|
|
184 }
|
|
185 }
|
|
186 tree_level--;
|
|
187 printf(")");
|
|
188 break;
|
|
189 }
|
|
190 }
|
|
191 }
|
|
192 }
|