void Generate (AST* ast, int i,char* str) { switch(ast->type){ case tok_plus:case tok_mul:case tok_minus:case tok_div: case tok_gt:case tok_gte:case tok_lt:case tok_lte: case tok_eq: GenerateOperation(ast, i); break; case tok_number: GenerateNumber(ast); break; case tok_if: GenerateIf (ast, i, str); break; case tok_setq: GenerateSetq (ast, i); break; case tok_valiable: GenerateVariable (ast); break; case tok_defun: GenerateDefun (ast); break; case tok_arg: GenerateArg (ast); break; case tok_func: GenerateFunc (ast, i); break; default: printf("default\n"); break; } free(ast); }
/* * genstmt will generate a statement and follow the next pointer * until the block is generated. */ void GenerateStatement(Statement *stmt) { AMODE *ap; while( stmt != NULL ) { GenMixedSource(stmt); switch( stmt->stype ) { //case st_vortex: // gen_vortex(stmt); // break; case st_funcbody: GenerateFuncbody(stmt); break; case st_compound: GenerateCompound(stmt); break; case st_try: GenerateTry(stmt); break; case st_throw: GenerateThrow(stmt); break; case st_intoff: GenerateIntoff(stmt); break; case st_stop: GenerateStop(stmt); break; case st_inton: GenerateInton(stmt); break; case st_asm: GenerateAsm(stmt); break; case st_label: GenerateLabel((int64_t)stmt->label); break; case st_goto: GenerateMonadic(isThor?op_br:op_bra,0,make_clabel((int64_t)stmt->label)); break; //case st_critical: // GenerateCritical(stmt); // break; case st_spinlock: GenerateSpinlock(stmt); break; case st_spinunlock: GenerateSpinUnlock(stmt); break; case st_check: GenerateCheck(stmt); break; case st_expr: initstack(); ap = GenerateExpression(stmt->exp,F_ALL | F_NOVALUE, GetNaturalSize(stmt->exp)); ReleaseTempRegister(ap); tmpFreeAll(); break; case st_return: if (isFISA64) GenerateFISA64Return(currentFn,stmt); else if (is816) Generate816Return(currentFn,stmt); else if (isTable888) GenerateTable888Return(currentFn,stmt); else if (isRaptor64) GenerateRaptor64Return(currentFn,stmt); else GenerateReturn(currentFn,stmt); break; case st_if: GenerateIf(stmt); break; case st_do: GenerateDo(stmt); break; case st_dountil: GenerateDoUntil(stmt); break; case st_doloop: GenerateForever(stmt); break; case st_while: GenerateWhile(stmt); break; case st_until: GenerateUntil(stmt); break; case st_for: GenerateFor(stmt); break; case st_forever: GenerateForever(stmt); break; case st_firstcall: GenerateFirstcall(stmt); break; case st_continue: if (contlab==-1) error(ERR_NOT_IN_LOOP); GenerateDiadic(isThor?op_br:op_bra,0,make_clabel(contlab),0); break; case st_break: if (breaklab==-1) error(ERR_NOT_IN_LOOP); GenerateDiadic(isThor?op_br:op_bra,0,make_clabel(breaklab),0); break; case st_switch: genxswitch(stmt); break; case st_empty: break; default: printf("DIAG - unknown statement.\n"); break; } stmt = stmt->next; } }