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