示例#1
0
文件: genlisp.c 项目: dokterp/aldor
local SExpr
gl0MakeLocals(Foam locals, SExpr inits0)
{
	SExpr     typedVars, liId, inits = inits0;
	int	  i, argc = foamDDeclArgc(locals);
	Foam	  *argv = locals->foamDDecl.argv;
	String	  id, typeId;

	assert(foamTag(locals) == FOAM_DDecl);

	typedVars = sxNil;

	for (i=0; i<argc; i++) {
		id = argv[i]->foamDecl.id;
		liId = gl0Id(FOAM_Loc, i, id);
		typeId = foamInfo(argv[i]->foamDecl.type).str;
		typedVars = sxCons(lisp1(liId, gl0typeName(typeId)),
				   typedVars);
	}

	if (sxiNull(inits0)) 
		return sxNReverse(typedVars);

	for(; inits != sxNil; inits = sxCdr(inits)) {
		liId = sxSecond(sxCar(inits)); /* Nasty ! */
		typeId = symString(sxiToSymbol(liId))[0]=='l' 
			 ? "Level" : "Env";
		typedVars = sxCons(lisp1(liId, gl0typeName(typeId)),
				   typedVars);
	}

	return sxNReverse(typedVars);
}
示例#2
0
文件: genlisp.c 项目: dokterp/aldor
local SExpr
gliExpr(Foam foam)
{
	SExpr     sx = sxNil;

	switch (foamTag(foam)) {
	  case FOAM_Prog:
		bugBadCase(FOAM_Prog);
		break;
		
	  case FOAM_NOp:
	  case FOAM_Nil:
		sx = GL_Nil;
		break;
	  case FOAM_CCall: {
		  sx = gl0ExprOf(GL_CCall, 1, foam);
		  break;
	  }
	  case FOAM_OCall: {
		  sx = gl0OpenCall(foam);
		  break;
	  }
	  case FOAM_BVal: {
		  FoamTag op = foam->foamBVal.builtinTag;
		  sx = gl0ExprOf(foamBValSExpr(op), 1, foam);
		  break;
	  }
	  case FOAM_BCall: {
		  FoamTag op = foam->foamBCall.op;
		  sx = gl0ExprOf(foamBValSExpr(op), 1, foam);
		  break;
	  }
	  case FOAM_PCall:
		sx = gliPCall(foam);
		break;
	  case FOAM_If:
		sx = gliIf(foam);
		break;
	  case FOAM_Set: 
		sx = gliSet(foam);
		break;
	  case FOAM_Def: 
		sx = gliDef(foam);
		break;
	  case FOAM_PushEnv: 
		sx = gliPushEnv(foam);
		break;
	  case FOAM_PopEnv: 
		sx = GL_Nil;
		break;
	  case FOAM_EEnv: 
		sx = gliEEnv(foam);
		break;
	  case FOAM_Seq:
		sx = gl0ExprOf(GL_Progn, int0, foam);
		break;
	  case FOAM_Par:
	  case FOAM_Loc:
	  case FOAM_Glo:
	  case FOAM_Const:
		sx = gliId(foam);
		break;
	  case FOAM_Lex:
		sx = gliLex(foam);
		break;
	  case FOAM_Return:
		sx = lisp2(GL_ReturnBlock, glvFunName,
			   gliExpr(foam->foamReturn.value));
		break;
	  case FOAM_Cast:
		sx = gliExpr(foam->foamCast.expr);
		break;
	  case FOAM_Clos:
		sx = gl0ExprOf(GL_Clos, int0, foam);
		break;
	  case FOAM_Env:
		sx = gliEnv(foam);
		break;
	  case FOAM_EInfo:
		sx = gliEInfo(foam);
		break;
	  case FOAM_PRef:
	  	sx = gliPRef(foam);
		break;
	  case FOAM_Arr:
		sx = gliArr(foam);
		break;
	  case FOAM_CEnv:
		sx = gl0ExprOf(GL_ClosEnv, int0, foam);
		break;
	  case FOAM_CProg:
		sx = gl0ExprOf(GL_ClosFun, int0, foam);
		break;
	  case FOAM_Values:
		if (foamArgc(foam) == 0)
			sx = sxNil;
		else 
			sx = gl0ExprOf(GL_Values, int0, foam);
		break;
	  case FOAM_MFmt:
		sx = gliExpr(foam->foamMFmt.value);
		break;
	  case FOAM_EElt:
		sx = gliEElt(foam);
		break;
	  case FOAM_Char: /* XXX: Should be fixed elsewhere */
		sx = lisp2(GL_The, GL_Char,
			   (foam->foamChar.CharData=='\0')
			   ? GL_NUL	
                           : sxiFrChar(foam->foamChar.CharData));
		break;
	  case FOAM_Bool:
		sx = lisp2(GL_The, GL_Bool, (foam->foamBool.BoolData ?
					    GL_T : GL_Nil));
		break;
	  case FOAM_Byte:
		sx = lisp2(GL_The, GL_Byte,
			   sxiFrInteger(foam->foamByte.ByteData));
		break;
	  case FOAM_SInt:
		sx = lisp2(GL_The, GL_SInt,
			   sxiFrInteger(foam->foamSInt.SIntData));
		break;
	  case FOAM_HInt:
		sx = lisp2(GL_The, GL_HInt,
			   sxiFrInteger(foam->foamHInt.HIntData));
		break;
	  case FOAM_BInt:
		sx = lisp2(GL_The, GL_BInt,
			   sxiFrBigInteger(foam->foamBInt.BIntData));
		break;
	  case FOAM_SFlo:
		sx = lisp2(GL_The, GL_SFlo, sxiFrSFloat(foamToSFlo(foam)));
		break;
	  case FOAM_DFlo:
		sx = lisp2(GL_The, GL_DFlo, sxiFrDFloat(foamToDFlo(foam)));
		break;
	  case FOAM_Goto:
		sx = lisp1(GL_Go,
			   lispId(strPrintf("Lab%d", foam->foamGoto.label)));
		glvHasGoto = 1;
		break;
	  case FOAM_Label:
		sx = lispId(strPrintf("Lab%d", foam->foamGoto.label));
		break;
	  case FOAM_Select:
		sx = gliSelect(foam);
		break;
	  case FOAM_ANew:
		sx = gliANew(foam);
		break;
	  case FOAM_RNew:
		sx = gliRNew(foam);
		break;
	  case FOAM_AElt:
		sx = gliAElt(foam);
		break;
	  case FOAM_RElt:
		sx = gliRElt(foam);
		break;
	  case FOAM_Free:
		sx = lisp1(GL_FoamFree, gliExpr(foam->foamFree.place));
		break;
	  case FOAM_EEnsure:
		sx = lisp1(GL_FoamEEnsure, gliExpr(foam->foamEEnsure.env));
		break;
	  default:
		printf("unhandled foamTag = %s\n",
		       foamInfo(foamTag(foam)).str);
		sx = lispId("unhandled!");
		break;
	}
	return sx;
}
示例#3
0
文件: axlcomp.c 项目: nilqed/aldor
void
compInfoAudit(void)
{
#if !defined(NDEBUG)
	int	i;

	for (i = 0; i < OB_LIMIT; i++)
		if (obInfo[i].code != i)
			bug("obInfo is badly initialized at %d.", i);
	compInfoByteLimit(OB_LIMIT, "OB_LIMIT");

	for (i = 0; i < PH_LIMIT; i++)
		if (phInfo[i].phno != i)
			bug("phInfo is badly initialized at %d.", i);
	compInfoByteLimit(PH_LIMIT, "PH_LIMIT");

	for (i = TK_START; i < TK_LIMIT; i++)
		if (tokInfo(i).tag != i)
			bug("tokInfo is badly initialized at %d.", i);
	compInfoByteLimit(TK_LIMIT, "TK_LIMIT");

	for (i = AB_START; i < AB_LIMIT; i++)
		if (abInfo(i).tag != i)
			bug("abInfo is badly initialized at %d.", i);
	compInfoByteLimit(AB_LIMIT, "AB_LIMIT");

	for (i = TF_START; i < TF_LIMIT; i++)
		if (tformInfo(i).tag != i)
			bug("tformInfo is badly initialized at %d.", i);
	compInfoByteLimit(TF_LIMIT, "TF_LIMIT");

	for (i = 0; i < SYME_LIMIT; i++)
		if (symeInfo[i].kind != i)
			bug("symeInfo is badly initialized at %d.", i);
	compInfoByteLimit(SYME_LIMIT, "SYME_LIMIT");

	for (i = FOAM_START; i < FOAM_LIMIT; i++)
		if (foamInfo(i).tag != i)
			bug("foamInfo is badly initialized at %s = %d.",
			    foamStr(i), i);
	compInfoByteLimit(foamTagLimit(), "foamTagLimit()");

	for (i = LIB_NAME_START; i < LIB_NAME_LIMIT; i++)
		if (libSectInfo(i).tag != i)
			bug("libSectInfo is badly initialized at %s = %d.",
			    libSectInfo(i).str, i);
	compInfoByteLimit(LIB_NAME_LIMIT, "LIB_NAME_LIMIT");

	for (i = FOAM_BVAL_START; i < FOAM_BVAL_LIMIT; i++)
		if (foamBValInfo(i).tag != i)
			bug("foamBValInfo is badly initialized at %s = %d.",
			    foamBValStr(i), i);
#if SMALL_BVAL_TAGS
	compInfoByteLimit(FOAM_BVAL_LIMIT, "FOAM_BVAL_LIMIT");
#endif

	for (i = FOAM_PROTO_START; i < FOAM_PROTO_LIMIT; i++)
		if (foamProtoInfo(i).tag != i)
			bug("foamProtoInfo is badly initialized at %s = %d.",
			    foamProtoStr(i), i);
	compInfoByteLimit(FOAM_PROTO_LIMIT, "FOAM_PROTO_LIMIT");

	for (i = CCO_START; i < CCO_LIMIT; i++)
		if (ccoInfo(i).tag != i)
			bug("ccoInfo is badly initialized at %d.", i);
	compInfoByteLimit(CCO_LIMIT, "CCO_LIMIT");
#endif
}