コード例 #1
0
TSMethod* FindMethod(Lexer::TTokenPos* source, std::vector<TSMethod*> &methods_to_call, const std::vector<TExpressionResult> &actual_params)
{
	int conv_needed;
	for (size_t k = 0; k<actual_params.size(); k++){
		if (actual_params[k].IsVoid())
			source->Error("Параметр метода должен иметь тип отличный от void!");
	}
	int min_conv_method=-1,temp_conv,conv;
	conv_needed=-1;
	for (size_t i = 0; i<methods_to_call.size(); i++)
	{			
		if (actual_params.size() == 0 && methods_to_call[i]->GetParamsCount() == 0){
			conv_needed=0;
			return methods_to_call[i];
		}
		if (actual_params.size() != methods_to_call[i]->GetParamsCount())goto end_search;
		temp_conv=0;
		conv=0;
		for (size_t k = 0; k<actual_params.size(); k++){
			TSParameter* p=methods_to_call[i]->GetParam(k);
			if (!IsEqualClasses(actual_params[k], p->AsFormalParameter(), conv))goto end_search;
			else temp_conv+=conv;
		}
		if(temp_conv<conv_needed||conv_needed==-1)
		{
			conv_needed=temp_conv;
			min_conv_method=i;
		}end_search:
		continue;
	}
	if(min_conv_method>=0)
		return methods_to_call[min_conv_method];		
	return NULL;
}
コード例 #2
0
void TSStatement::TestBoolExpr(TExpressionResult& compare_result, std::unique_ptr<TActualParamWithConversion>& conversion)
{
    int conv_needed;

    TSClass* bool_class = owner->GetClass(GetSyntax()->source->GetIdFromName("bool"));
    TFormalParameter formal_param(bool_class, false);
    if (!IsEqualClasses(compare_result, formal_param, conv_needed))
        GetSyntax()->Error("Выражение невозможно преобразовать в логический тип!");

    conversion.reset(new TActualParamWithConversion());
    conversion->BuildConvert(compare_result, formal_param);
}