#include #include #include "tree.h" #include "qc.h" #define NODE_ARRAY_SIZE 4096 /* stringf.c で定義 */ char *Stringf(char *fmt, ...); /* 文字列を生成して返す (malloc 使用) */ /********************************/ /* 構文木 (ノード) 関係 */ /********************************/ /* ノードの配列 */ struct node NodeArray[NODE_ARRAY_SIZE]; int NAp=0; /* ノード (トークン,タプル兼用) 生成ルーチン */ Node mkNode(int type, Node left, Node right) { Node p = &NodeArray[NAp++]; p->type = type; p->left = left; p->right = right; return p; } /* トークン (終端記号) のノードの生成 */ /* SYM (記号): */ /* NUM (整数値): */ /* STR (文字列): */ /* [注] オブジェクト構造体へのポインタの初期値は NUL である. */ /* 実際の具体的な値は意味解析時に与えられる. */ Node mkSymNode(char *name) { return mkNode(SYM, (Node)Stringf("%s",name), NUL); } Node mkNumNode(int n) { return mkNode(NUM, (Node)n, NUL); } Node mkStrNode(char *name) { return mkNode(STR, (Node)Stringf("%s",name), NUL); } /* 木構造表示ルーチン */ void putTreeSub(char *pre, Node t) { char *pre2; if (t==NUL) { printf("NUL\n%s\n", pre); return; } switch (t->type) { case NUM: printf(" %d\n%s\n", (int)t->left, pre); return; case STR: printf("%s\n%s\n", (char *)t->left, pre); return; case SYM: printf(" %s (0x%x)\n%s\n", (char *)t->left, (int)t->right, pre); return; case VAR: printf("VAR--"); break; case RETURN: printf("RTRN-"); break; case IF: printf("IF---"); break; case ELSE: printf("ELSE-"); break; case WHILE: printf("WHIL-"); break; case BRBR: printf("'||'-"); break; case AMAM: printf("'&&'-"); break; case EXEQ: printf("'!='-"); break; case EQEQ: printf("'=='-"); break; case GTEQ: printf("'>='-"); break; case LTEQ: printf("'<='-"); break; case UMINUS: printf("UMIN-"); break; case Fdef: printf("Fdef-"); break; case Func: printf("Func-"); break; case Gvar: printf("Gvar-"); break; case Lvar: printf("Lvar-"); break; case Sclr: printf("Sclr-"); break; case Arry: printf("Arry-"); break; default: printf("'%c'--", t->type); } putTreeSub(Stringf(" | %s", pre), t->right); printf("%s", pre); putTreeSub(pre, t->left); } void putTree(Node t) { if (t) putTreeSub("", t); }