#/usr/bin/perl

# Solution 1 : JMD
# On veut chercher des patrons morphosyntaxiques dans le fichier taggé par Cordial 
# Cordial 3 colonnes: mot, lemme, etiquettes de catégories
# Fichier patron.txt contenant le motif recherché (il est possible d'y mettre des regexp)
# Chercher correspondance entre le patron et la 3eme colonne du fichier Cordial 
# Puis faire sortir les items de la premiere colonne (les mots)
# On va transformer les colonnes en listes. On aura trois listes alignees.

# On ne s'interesse qu'aux lignes qui ont trois colonnes
# On ne s'interesse pas aux ponctuations
# Probleme des ligne vides

# Lecture du fichier patron
open(PATRON, "$ARGV[1]");
my @LISTEPATRON=<PATRON>; #lecture globale du fichier dans une liste 
close(PATRON);

my @LISTETOKEN=();
my @LISTELEMME=();
my @LISTEETIQUETTE=();
# Le fichier Cordial est le premier argument
open (CORDIAL, "$ARGV[0]"); # pour l'instant on met pas l'encodage
while (my $ligne = <CORDIAL>) {
	$ligne=~s/\r//; # Comme le fichier Cordial vient de Windows, c'est mieux de  supprimer les \r
	chomp($ligne); 
	if ($ligne=~/^([^\t]+)\t([^\t]+)\t([^\t]+)$/) { # On s'interesse aux lignes qui ont trois elements separes par deux tabulations 
	# les () capturent le resultat de la regexp (1)=le mot (2)=le lemme (3)=la categorie
		my $token=$1;
		my $lemme=$2;
		my $etiquette=$3;
		#print $ligne;
		if ($etiquette!~/^PCTF/) {
			push(@LISTETOKEN, $token);
			push(@LISTELEMME, $lemme);
			push(@LISTEETIQUETTE, $etiquette);
		}
		else {
			# &compare(@LISTETOKEN, @LISTEETIQUETTE); > Attention! si on fait ça, les deux listes sont prises comme une seule (sans frontiere entre les listes)
			&compare(\@LISTETOKEN, \@LISTEETIQUETTE); # comme ça les listes sont transformées en scalaires
			# Creation d'une reference vers une liste
			@LISTETOKEN=();
			@LISTELEMME=();
			@LISTEETIQUETTE=();
		}
	}
}

# ----------------------------------------------
# SOUS-PROGRAMME
sub compare { # Procedure pour comparer avec le patron recherché
	my ($first, $second)=@_;
	my @LISTETOKEN=@$first;
	my @LISTEETIQUETTE=@$second;
	#print "Liste de tokens : @LISTETOKEN\n";
	#print "Liste de tags : @LISTEETIQUETTE\n";
	foreach my $patron (@LISTEPATRON) {
		$patron=~s/\r//;
		chomp $patron;
		#print "$patron\n";
		#print "Tapez une touche pour continuer...\n";
		#my $rep=<STDIN>;
		my $texte_des_pos=join(" ", @LISTEETIQUETTE); # IMPORTANT: le nb de blancs est utilisé apres pour l'extraction
		while ($texte_des_pos=~/$patron/g) {
			#print "YOUPI!! \n";
			# on veut savoir combien de blancs il y a dans le contexte gauche de la zone de correspondance
			my $contextebefore=$`;
			#print "CB : ",$contextebefore,"\n";
			my $compteurblanc=0;
			while ($contextebefore=~/ /g) {
				$compteurblanc++;
			}
			my @PATRONENCOURS=split(/ /, $patron);
			my $longueurpatron=$#PATRONENCOURS; # '$#' donne la valeur du plus grand indice d'une liste
			my $bornesup=$compteurblanc + $longueurpatron;
			print " @LISTETOKEN[$compteurblanc..$bornesup] \n"; #instruction de recherche d'une sousliste
		}
	}

}
