[OCaml] Erreur Syntaxe et autre

Résolu/Fermé
fantalbala Messages postés 10 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 21 mars 2011 - 20 mars 2011 à 15:38
fantalbala Messages postés 10 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 21 mars 2011 - 20 mars 2011 à 23:59
Bonjour,

Alors voici mon problème : je dois faire un programme en Caml dont le but est de fonctionner comme un moteur de recherche sur une collection de texte. J'ai deux grande fonctions principale à faire une qui permet de calculer un index (qui contient le découpage des texte en mot et autre chose intéressante pour alléger les calculs), et une deuxième qui permet de calculer la requête demander.

Donc me suis attaquer à la première partie (commençons dans l'ordre n'es ce pas x) ). Et après plusieurs heure acharné à corriger mes erreurs, deux subsistes ! Et impossible de savoir pourquoi !

Voici mon code :
(* Déclaration des types utilisés *)
type texte = string ;;
type colTexte = texte list ;;
type mot = string ;;
type nbOcurr = int ;;
type decompo = mot * nbOcurr list ;;
type index = texte * decompo list ;;

(* Déclarations des fonctions permettant de calculer l'index : *)

let rec trouveMot (copie : texte) motConst iDebut iFin =							(*Fonction permettant de récupérer un triplet contenant un mot, son indice de début et son indice de fin *)
	if iDebut = 0 or String.get copie (iDebut-1) = ' ' then							(* Si il n'est pas au début et que le caractère est bien au début d'un mot *)
		match String.get copie (iFin+1) with										(* Alors on récupère le caractère suivant *)
			|' ' | ',' |'.' -> (motConst,iDebut,iFin)								(* Si celui si est suivit d'un caractère indiquant la fin d'un mot (espace, virgule, point, etc) , on renvoi le mot avec son indice de début et son indice de fin *)
			| car -> let carI = String.make 1 car in 								(* Si celui ci est un caractère, on concatène le début du mot avec le caractère trouvé et on continue la recheche *)
					trouveMot copie (motConst^carI) iDebut (iFin+1)
	else																			(* Sinon (si le caractère n'est pas le début d'un mot) *)
		(motConst,-1,-1);;															(* On renvoi un triplet qui signal un cas d'erreur *)
	
let rec supprimerMot (copie:texte) iDebut iFin =									(*Fonction permettant de supprimer les mots dans la copie du texte *)
	if iDebut = iFin then															(* Lorsqu'on arrive sur la fin du mot, on supprime le caractère et on remonte *)
		String.set copie iDebut ' ' 
	else
		supprimerMot copie (iDebut+1) iFin; String.set copie iDebut ' ';; 		    (* Sinon on appel supprime le reste du mot puis on supprime le caractère courant *)
		
let rec nombreOccurence (copie : texte) motEncours caracPremier iDebut iFin start = 														(* Fonction permmettant de calculer le nombre d'occurence d'un mot dans un texte *)
	if String.contains_from copie start caracPremier then																					(* Si la chaîne de caractère contient encore le même caractère que le premier caractère du mot alors *)
		let debut = String.index_from copie start caracPremier in																			(* On récupère son indice *)
		match trouveMot copie (String.make 1 caracPremier) debut debut with																	(*  On récupère le mot à l'aide de la fonction trouveMot. En fonction du mot récupéré *)
			| (mot,-1,-1) -> nombreOccurence copie motEncours caracPremier iDebut iFin (debut+1) 											(* Si le caractère ne fait pas parti d'un mot, on relance la recherche en déclalant l'indice de debut de recherche *)
			| (mot,iNDebut,iNFin) -> traitement copie mot iNDebut iNFin motEncours iDebut iFin caracPremier									(* Si c'est bien un mot alors on lance le traitement de celui-ci *)			
	else 
		supprimerMot copie iDebut iFin ; 1  																								(* Si le caractère n'apparait plus, on supprime le mot en cours de recherche *)	

and traitement (copie : texte) mot iNDebut iNFin motEncours iDebut iFin caracPremier =
	if motEncours = mot then 																							(* Si c'est un mot, alors on regarde qu'il est identique au mot chercher, si c'est le cas alors *)
		supprimerMot copie iDebut iFin ; (nombreOccurence copie mot caracPremier iNDebut iNFin (iNFin+1)) +1    		(*On supprime ce mot de la copie du texte, afin de ne plus retomber dessus plus tard dans l'avancement du découpage, puis on incrémente le nombre d'occurence du mot *)
	else 
		nombreOccurence copie motEncours caracPremier iDebut iFin (iNFin+1) ;;											(* Sinon on continue de chercher dans le reste du texte *)

		
let rec decoupage (copie : texte) debut =																											(*Fonction permettant de découper le texte en mot et de remplir  le champs decompo d'un texte dans l'index*)
	if String.length copie > debut then 																											(* Si la taille du texte est supérieur au début de le recherche des mots *)
		match String.get copie debut with 																											(* Alors on regarde le premier caractère *)
			| ' ' | ',' |'.' -> decoupage copie (debut+1)																							(* Si c'est un espace ou une virgule ou un point, on passe à la suite *)	
			| caract -> let carI  = String.make 1 caract  in 																						(* Si c'est un caractère alors, on transforme dans un premier temps ce caractère en chaine de caractères *)
						let motTrouve = trouveMot copie carI debut debut in																			(* On appel la fonction qui permet de récupérer le mot entier (et pas seulement son premier caractère comme maintenant) *)	
						(match  motTrouve with																										(* En fonction du résultat de la fonction *)
							|(car,-1,-1) -> decoupage copie (debut+1)																				(* Si en fait ce n'était pas le début d'un mot (cas d'erreur probable), on continue de lire le texte pour trouver des mots *)
							| (mot,iDebut,iFin) -> (mot, (nombreOccurence copie mot caract iDebut iFin (iFin+1)) ) :: decoupage copie (iFin+1) )	(* Si c'est bien un mot alors on renvoie dans la liste de décomposition la paire contenant le mot et le nombre de fois que le mot est présent dans le texte *)
	else	[] ;;																																	(* Sinon (la taille du texte est inférieur à l'indice de début), on renvoie la chaîne vide*)													
	
let rec calculIndex (collection : colTexte) =									(* Fonction lançant le calcul de l'index *)
	match collection with 														(* Pour chaque texte de la collection *)
	|[] -> []																	(* Quand c'est fini on renvoie la chaine vide *)
	| txt :: suite -> (txt, decoupage (String.copy txt) 0) :: calculIndex suite ;;		(* On ajoute à l'index la paire contenant le texte et son découpage *) 


(ouais je sais c'est trop beau x) )

Les deux lignes soulignées sont celle contenant des erreurs, alors la première j'ai comme erreur ceci : File "DMV2.ml", line 33, characters 35-36:
Error: This expression has type int but is here used with type unit

Et la deuxième me fait une syntax erreur.

Si vous pouviez m'aider se serais super gentil de votre part car moi je bloque là :/ (et je suis sûre que ce sont deux tites merdouilles qui font tout planter u_u). Ah oui j'ai besoin d'une réponse assez rapidement car le code doit être prêt pour mardi (héhéhé les progs à la bourre ya que ça de vrai x) ) et j'ai encore la deuxième partie à faire ^^

Merci d'avance de vos réponses ;)

A très vite ^^

1 réponse

fantalbala Messages postés 10 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 21 mars 2011
20 mars 2011 à 23:59
Pour ceux qui voudrais savoir Caml ne gére pas la séquentialité action1 ; action 2. pour feinter il faut faire let truc = action1 in action2
0