Ejemplo n.º 1
0
void OpOr::Apply(Expression *expression, Calculator *calculator, int32 recursions)
{
	bool allBools(true);
	bool result(false);
	for(ExprVector::iterator leaf = expression->Leaves().begin(); leaf != expression->Leaves().end(); )
	{
		(*leaf)->Evaluate(calculator, recursions);
		string symbolName = (*leaf)->SymbolName();
		// All false values can be deleted from the leaves list
		if(symbolName == "False")
		{
			expression->DeleteLeaf(leaf);
			// Need not increment iterator
		}
		else if(symbolName == "True")
		{
			result = true;
			break;
		}
		else
		{
			allBools = false;
			++leaf;
		}
	}
	if(result)
		expression->MoveNotCloned(ExprPtr(new Expression("True")));
	else if(allBools)
		expression->MoveNotCloned(ExprPtr(new Expression("False")));
	else
		expression->ApplyOneIdentity();
}
Ejemplo n.º 2
0
void Not::Apply(Expression *expression, Calculator *calculator, int32 recursions)
{
	if(expression->LeafCount() != 1)
		throw ArgumentException("Not expects 1 argument.");
	if(expression->Leaf(0)->SymbolName() == "True")
		expression->MoveNotCloned(ExprPtr(new Expression("False")));
	else if(expression->Leaf(0)->SymbolName() == "False")
		expression->MoveNotCloned(ExprPtr(new Expression("True")));
}
Ejemplo n.º 3
0
ExprPtr Parser::patternMatch(bool se)
{
	expect(TCase);
	auto const& value = primaryExpression(false);
	expect(TLBrace);

	IntrusiveRefCntPtr<MatchExpr> matchExpr(new MatchExpr(value));

	do
	{
		if(token == TTypeIdent || token == TIdent) // TODO: firstPattern set
		{
			enterScope(new Scope);

			auto pt = pattern(false);
			
			// TODO: Allow pattern = expr
			auto body = exitScope<Expr>(block(true));

			matchExpr->legs.push_back(MatchLeg(pt, body));
		}
	}
	while(test(TSemicolon));

	expect(TRBrace, se);

	return ExprPtr(matchExpr.getPtr()); // TEMP
}
Ejemplo n.º 4
0
ExprPtr MatchSingleNonRejectExpr::resolve(ModuleBuilder& modBuilder)
{
	value = value->doResolve(modBuilder);
	pattern->doResolve(modBuilder, value->type);
	type = tyUnit;
	return ExprPtr(this);
}
Ejemplo n.º 5
0
ExprPtr ModuleBuilder::resolveIdent(string const& name)
{
	auto i = module->functions.find(name);
	if(i != module->functions.end())
		return ExprPtr(new FuncRefExpr(i->second));

	// Check imports
	for(auto const& imp : imports)
	{
		auto t = imp->module->functions.find(name);
		if(t != imp->module->functions.end())
		{
			return ExprPtr(new FuncRefExpr(t->second));
		}
	}

	return ExprPtr();
}
Ejemplo n.º 6
0
ExprPtr Parser::statements()
{
	unique_ptr<SeqExpr> seq(inScope(new SeqExpr()));

	do
	{
#if 0 // TODO. Disabled until we know how to handle return
		if (test(TReturn))
		{
			seq->expressions.push_back(ExprPtr(inScope(
				new ReturnExpr(expression(true)))));
			break; // Return must be the last statement in a statement list
		}
#endif
					
		statement(*seq);
	}
	while(test(TSemicolon));

	return ExprPtr(seq.release());
}
Ejemplo n.º 7
0
ExprPtr CreateExpr::resolve(ModuleBuilder& modBuilder)
{
	for(auto& p : parameters)
		p = p->doResolve(modBuilder);

	ctor->doResolve(modBuilder);

	// ctor->type will be a non-applied type. 

	type = ctor->type;

	return ExprPtr(this);
}
Ejemplo n.º 8
0
ExprPtr Parser::controlSeqExpression(bool se)
{
	if(test(TIf))
	{
		auto ifExpr = enterScope<IfExpr>(new IfExpr);
		ifExpr->cond = expression(false);
		enterScope(new Scope);
		ifExpr->trueCase = exitScope<Expr>(controlSeqExpression(se));
		exitScope<IfExpr>(ExprPtr());
		ExprPtr ret = ifExpr;
		if(test(TElse))
		{
			enterScope(new Scope);
			auto falseCase = exitScope<Expr>(controlSeqExpression(se));
			ret = inScope(new IfElseExpr(ifExpr, falseCase));
		}
		return ret;
	}
	/* TODO
	else if (Test(Token.While))
	{
		var whileExpr = EnterScopeT<WhileExpr>();

		whileExpr.Cond = Expression(false);
		whileExpr.Body = ControlSeqExpression(se);
		ExitScopeT<WhileExpr>(null);
		return whileExpr;
	}*/
	else if(token == TLBrace)
	{
		return block(se);
	}

	assert(false);
	return ExprPtr();
}
Ejemplo n.º 9
0
void OpHead::Apply(Expression *expression, Calculator *calculator, int32 recursions)
{
	if(expression->LeafCount() != 1)
		throw ArgumentException("Head expects 1 argument.");
	Expression *leaf = expression->Leaf(0);
	if(leaf->IsAtom())
	{
		Atom *atom = leaf->AtomHead();
		expression->MoveNotCloned(ExprPtr(new Expression(atom->AtomName())));
	}
	else
	{
		ExprPtr head(leaf->Head()->Clone());
		expression->MoveNotCloned(head);
	}
}
Ejemplo n.º 10
0
void Parser::varDecl(SeqExpr& seqExpr, bool se)
{
	expect(TLet);

	do
	{
		auto const& pat = pattern(false);

		expect(TEqual);
		auto const& val = expression(se);

		seqExpr.expressions.push_back(
			ExprPtr(new MatchSingleNonRejectExpr(val, pat)));
	}
	while(test(TComma));
}
Ejemplo n.º 11
0
ExprPtr MatchExpr::resolve(ModuleBuilder& modBuilder)
{
	value = value->doResolve(modBuilder);
		
	for(auto& leg : legs)
	{
		leg.pattern->doResolve(modBuilder, value->type);
		leg.body = leg.body->doResolve(modBuilder);

		if(! type)
			type = leg.body->type;
		else
			type = type->commonWith(leg.body->type);
	}

	return ExprPtr(this);
}
Ejemplo n.º 12
0
SharedSurfaceInfo::SharedSurfaceInfo(Rect2d region, Vec2i dicing):
        region(region),
        dicing(dicing),
        vtx_buf_id(0),
        idx_buf_id(0),
        valid(false){
    //do nothing else
}

SharedSurfaceInfo::~SharedSurfaceInfo(){
    //todo: don't know what happens if OpenGL context isn't valid
    this->release();
}

VisSurface::VisSurface(ExprPtr(Vec2d,Vec3d) surface):
        surface(surface),
        sharedInfo(new SharedSurfaceInfo(Rect2d(ZERO_VEC2d, ONE_VEC2d), Vec2i(64,64))){
    //do nothing else
}

VisSurface::VisSurface(ExprPtr(Vec2d,Vec3d) surface, Rect2d region, Vec2i divisions):
        surface(surface),
        sharedInfo(new SharedSurfaceInfo(region, divisions)){
    //do nothing else
}

VisSurface::~VisSurface() {
    //do nothing: resource deallocation handled by shared_ptrs
}
Ejemplo n.º 13
0
 ExpressionStatement::ExpressionStatement(Expression* expression)
   : ExpressionStatement(ExprPtr(expression)) {
 }
Ejemplo n.º 14
0
void Parser::constructor(string const& name, IntrusiveRefCntPtr<TypeDef> type, TypePtr const& typeRef)
{
	IntrusiveRefCntPtr<TypeConstructor> ctor(new TypeConstructor(name));
	type->constructors.push_back(ctor);
	ctor->type = typeRef;

	expect(TLParen);

	if(token != TRParen)
	{
		do
		{
			bool isLet = test(TLet);

			string name;

			// TODO: Common pattern?
			TypePtr type = maybeType(false);
			if(! type)
			{
				name = expectIdent();
				type = typeName(false);
			}

			ctor->members.push_back(TypeMember(name, type));
			++ctor->ctorParams;
		}
		while(test(TComma));
	}

	{
		string const& ctorName = name;
		// Constructor function
		IntrusiveRefCntPtr<FuncDef> ctorFunc(new FuncDef(ctorName));

		enterFunction(ctorFunc);
		enterScope(new Scope);

		// Constructor function has the same type parameters
		for(auto& p : type->typeParams)
			ctorFunc->typeParams.push_back(p);

		int dummy = 0;

		IntrusiveRefCntPtr<CreateExpr> body(new CreateExpr());

		body->ctor = ctor;

		for(int i = 0; i < ctor->ctorParams; ++i)
		{
			auto& member = ctor->members[i];
			auto p = declParam(ctorFunc, member.name, member.type->fresh(), &dummy);
			body->parameters.push_back(ExprPtr(new VarRef(p)));
		}

		ctorFunc->body = exitScope<Expr>(body);
		ctorFunc->returnType = typeRef;

		// TODO: Check for name collision
		mod->functions[ctorName] = ctorFunc;
		mod->constructorDefs[ctorName] = ctor;
		exitFunction();
	}

	expect(TRParen, true);
}