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