Exemplo n.º 1
0
int evaluateWord(int code){ //(code is correct syntax)?return>0:return<0
	logPutOut("evaluateWord(%d)",code);
	if(code>NUMOFTOKEN&&code<=NUMOFTOKEN+NUMOFSYNTAX){
		logPutOut("-evaluateSyntax\n");
		return(evaluateSyntax(code)); //return>0 is correct
	}else if(code>0&&code<=NUMOFTOKEN){
		logPutOut("-evaluateToken\n");
		return(evaluateToken(code)); //return>0 is correct
	}else{
		logPutOut("-ERR\n");
		return -1;
	}
}
Exemplo n.º 2
0
Obj_ptr evaluate(const ParseTree_ptr &root, env_ptr & env)
{
	if (root == nullptr)
		return nullptr;

	std::string token = root->getToken();
	Obj_ptr obj;
	bool numberFlag = true, rationalFlag = false, realFlag = false, idenFlag = true;

	checkToken(token, numberFlag, rationalFlag, realFlag, idenFlag);

	//----number-----
	if (numberFlag)
	{
		//----integer-----
		if (!rationalFlag && !realFlag)
			obj = Obj_ptr( new IntegerObj( bigInteger(token) ) );
		//----rational----
		else if (rationalFlag)
			obj = Obj_ptr( new RationalObj( bigRational(token) ) );
		//----real--------
		else
			obj = Obj_ptr( new RealObj( bigReal(token) ) );
		return descend(obj);
	}

	//----comma--------
	else if (token[0]==',')
		throw syntaxError("unexpected comma here");

	//----identifier----
	else if (idenFlag)
	{
		obj = findIden(env, token);
		if (obj.get() == nullptr)
		{
			if (builtInProcedure.find(token) == builtInProcedure.end())
				throw syntaxError("Undefined identifier: " + token);
			Arg_ptr nullArg(nullptr);
			ParseTree_ptr nullTree(nullptr);
			env_ptr nullEnv(nullptr);
			obj = Obj_ptr(new ProcedureObj(nullArg, nullTree, nullEnv, true, token));
		}
		return descend(obj);
	}

	//----char&bool-----
	else if (token[0]=='#')
	{
		//----char-----
		if (token[1]=='\\')
		{
			if (token=="#\\newline")
				obj = Obj_ptr( new CharObj('\n') );
			else if (token=="#\\space")
				obj = Obj_ptr( new CharObj(' ') );
			else if (token=="#\\tab")
				obj = Obj_ptr( new CharObj('\t') );
			else
				obj = Obj_ptr( new CharObj(token[2]) );

			return descend(obj);
		}
		//----bool-----
		else
		{
			
			if (token[1]=='t')
				obj = Obj_ptr( new BoolObj(true) );
			else
				obj = Obj_ptr( new BoolObj(false) );

			return descend(obj);
		}
	}

	//----string-------
	else if (token[0]=='\"')
	{
		obj = Obj_ptr( new StringObj(token.substr(1, token.size()-2)) );
		return descend(obj);
	}

	//----quote-------
	else if (token=="\'")
	{
		obj = Quote(root);
		return descend(obj);
	}

	else if (token=="`")
	{
		obj = Quasiquote(root, env);
		return descend(obj);
	}

	//----syntax&procedure----
	else if (token=="()")
	{
		ParseTree_ptr name = root->getSon();

		if (name == nullptr)
			throw syntaxError("missing expression");

		std::string iden = name->getToken();

		//--------syntax------------
		if (builtInSyntax.find(iden) != builtInSyntax.end())
		{
			return descend(evaluateSyntax(iden, name->getBrother(), env));
		}
		
		//--------procedure---------

		Obj_ptr obj = findIden(env, iden);

			//--------procedure object----
			if (iden == "()")
			{
				obj = evaluate(name, env);
				if (obj->Type != Procedure)
					throw syntaxError("not a procedure");
			}


		if (obj==nullptr)
		{
			if (builtInProcedure.find(iden) == builtInProcedure.end())
				throw syntaxError("Undefined identifier: " + iden);
		}
		else if (obj->Type != Procedure)
			throw syntaxError("\'" + iden + "\' is not a procedure");

		ParseTree_ptr para = name->getBrother();
		Para_ptr head=nullptr, tail=nullptr;

		while (para!=nullptr)
		{
			if (head==nullptr)
			{
				head = Para_ptr( new Parameters(evaluate(para, env)) );
				tail = head;
			}
			else
			{
				tail->next = Para_ptr( new Parameters(evaluate(para, env)) );
				tail = tail->next;
			}

			para = para->getBrother();
		}

		if (obj)	//define by user
		{
			return descend(evaluateUserDefined(obj, head, env));
		}
		else		// built-in
		{
			return descend(evaluateBuiltInProcedure(iden, head, env));
		}

	}

	//----else----------
	else
	{
		throw syntaxError("Illegal expression or the function you use is not available now.");
	}

}