Beispiel #1
0
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);
}
Beispiel #2
0
/*
 *      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;
    }
}