#define EXTERN /**/ #include "mc.h" typedef struct tree_node { int type; char *name; char *args; } tree_node; tree_node tree_nodes[] = { {(-1),"INT",""}, {(-2),"CHAR",""}, {(-3),"UNSIGNED",""}, {(-4),"POINTER","t"}, {(-5),"ARRAY","tv"}, {(-6),"STRUCT",""}, {(-7),"UNION",""}, {(-8),"FUNCTION","t"}, {(-9),"EMPTY",""}, {(-10),"STATIC",""}, {(-11),"GOTO",""}, {(-12),"RETURN",""}, {(-13),"BREAK",""}, {(-14),"CONTINUE",""}, {(-15),"IF",""}, {(-16),"ELSE",""}, {(-17),"FOR",""}, {(-18),"DO",""}, {(-19),"WHILE",""}, {(-20),"SWITCH",""}, {(-21),"CASE",""}, {(-22),"DEFAULT",""}, {(-23),"RESERVE",""}, {(-24),"TAG",""}, {(-25),"FIELD",""}, {(-26),"IDENT",""}, {(-27),"STRING",""}, {(-28),"MACRO",""}, {(-29),"BLABEL",""}, {(-30),"FLABEL",""}, {(-31),"TYPEDEF",""}, {(-32),"SIZEOF",""}, {(-33),"TYPE",""}, {(-34),"LONG",""}, {(-35),"SHORT",""}, {1,"GVAR","vs"}, {2,"RGVAR","vs"}, {3,"CRGVAR","vs"}, {4,"LVAR","v"}, {5,"RLVAR","v"}, {6,"CRLVAR","v"}, {7,"CONST","v"}, {8,"FNAME","n"}, {9,"INDIRECT","e"}, {10,"RINDIRECT","e"}, {11,"CRINDIRECT","e"}, {12,"ADDRESS","e"}, {13,"MINUS","e"}, {14,"LNOT","e"}, {15,"BNOT","e"}, {16,"INC",""}, {17,"POSTINC","e"}, {18,"PREINC","e"}, {19,"CPOSTINC","e"}, {20,"CPREINC","e"}, {21,"DEC",""}, {22,"CPOSTDEC","e"}, {23,"CPREDEC","e"}, {24,"MUL","ee"}, {25,"UMUL","ee"}, {26,"DIV","ee"}, {27,"UDIV","ee"}, {28,"MOD","ee"}, {29,"UMOD","ee"}, {30,"ADD","ee"}, {31,"SUB","ee"}, {32,"RSHIFT","ee"}, {33,"URSHIFT","ee"}, {34,"LSHIFT","ee"}, {35,"ULSHIFT","ee"}, {36,"GT","ee"}, {37,"UGT","ee"}, {38,"GE","ee"}, {39,"UGE","ee"}, {40,"LT","ee"}, {41,"ULT","ee"}, {42,"LE","ee"}, {43,"ULE","ee"}, {44,"EQ","ee"}, {45,"NEQ","ee"}, {46,"BAND","ee"}, {47,"EOR","ee"}, {48,"BOR","ee"}, {49,"LAND","ee"}, {50,"LOR","ee"}, {51,"COND","eee"}, {52,"ASS","ee"}, {53,"CASS","ee"}, {54,"ASSOP","eev"}, {55,"CASSOP","eev"}, {56,"COMMA","ee"}, {57,"LPAR",""}, {58,"RPAR",""}, {59,"LBRA",""}, {60,"RBRA",""}, {61,"LC",""}, {62,"RC",""}, {63,"COLON","ee"}, {64,"SM",""}, {65,"PERIOD",""}, {66,"ARROW",""}, {100,"AS",""}, }; tree_print(e) int e; { printf("* generate code on type:\n* "); tree_parse(type); printf("\n* expr:\n* "); tree_parse(e); printf("\n"); } int tree_level; tree_parse(e) int e; { tree_node *t; int i,j; char *s; if(e<0) { for(t=tree_nodes;t->type!=100;t++) { if(t->type==e) { for(j=0;j<tree_level;j++) putchar(' '); printf("list(%s)",t->name); break; } } } else { i = car(e); for(t=tree_nodes;t->type!=100;t++) { if(t->type==i) { tree_level++; for(j=0;j<tree_level;j++) putchar(' '); printf("list(%s",t->name); for(i=1,s=t->args;*s;s++,i++) { switch(*s) { case 'e': case 't': printf(",\n*"); tree_parse(heap[e+i]); break; case 'v': printf(",%d",heap[e+i]); break; case 'n': printf(",%s",((NMTBL *)heap[e+i])->nm); break; case 's': printf(",%s",heap[e+i]); break; case 'i': printf(",%d",heap[e+i]); break; } } tree_level--; printf(")"); break; } } } }