treegen_t* makeTreeGen (int N) { treegen_t* tg = NEW(treegen_t); tg->N = N; tg->T = genCnt(N); tg->sp = mkStack(N+1); tg->tp = mkTree(N+1); srand(time(0)); return tg; }
// 構文木をトレースする static void traceTree(int node) { if (node==SyNULL) return; // 何も無い int ty = syGetType(node); if (ty==SyIF) genIf(node); // if 文 else if (ty==SyELS) genEls(node); // if-else 文 else if (ty==SyWHL) genWhl(node); // while 文 else if (ty==SyDO) genDo(node); // do-while 文 else if (ty==SyBRK) genBrk(node); // break 文 else if (ty==SyCNT) genCnt(node); // continue 文 else if (ty==SyRET) genRet(node); // retrun 文 else if (ty==SyBLK || ty==SySEMI) { // ブロック traceTree(syGetLVal(node)); // 先に左側をコード生成 traceTree(syGetRVal(node)); // 次に右側をコード生成 } else if (ty==SyVAR) { // ローカル変数宣言 ; // 特にやることがない } else { // 式文 struct Expr *c = newExpr(); // 式の状態を管理するデータ genBoolExpr(node, c); // 式を処理する pop(c); // スタックにあれば捨てる free(c); // 管理データを解放 } }