#/usr/bin/perl -w
<<DOC;
Marie Garrigue
Sandy Bonin
MAI 2010

commande : perl bao3_cordial.pl fichier_cordial.cnr fichier_patrons_syntaxiques.txt

DOC
#-----------------------------------------------------------------------------------------------
#On ouvre en lecture les fichiers en entrée, sinon on affiche un message d'erreur
#-----------------------------------------------------------------------------------------------

open (FICTAG,$ARGV[0]) or die ("Probleme lors de l'ouverture du fichier d'entrée Cordial");
open (FICPOS,$ARGV[1]) or die ("Probleme lors de l'ouverture du fichier contenant les patrons syntaxiques");
#-----------------------------------------------------------------------------------------------
#On stocke les patrons syntaxiques dans une liste
#-----------------------------------------------------------------------------------------------
#On crée une liste "@listedespatrons"

my @listedespatrons=();
#Tant qu'il y a des patrons syntaxiques dans le fichier contenant les patrons syntaxiques, on effectue les opérations suivantes
while (my $lignepos=<FICPOS>) {
#On supprime le caractère de saut de ligne
chomp($lignepos);
#On ajoute le patron syntaxique dans la liste "@listedespatrons"
push(@listedespatrons,$lignepos);
}
#On ferme le fichier
close(FICPOS);
#-----------------------------------------------------------------------------------------------
#On initialise des listes
#-----------------------------------------------------------------------------------------------

my @malignesegmentee=();
my @listedetokens=();
my @listedelemmes=();
my @listedepos=();
#-----------------------------------------------------------------------------------------------
#On lit ligne par ligne le fichier d'entrée Cordial
#-----------------------------------------------------------------------------------------------
#Tant qu'il y a des lignes dans le fichier d'entrée Cordial, on effectue les opérations suivantes

while (my $ligne=<FICTAG>) {
#On ne s'occupe pas des lignes qui ne respectent pas le modèle "mot tabulation mot tabulation mot"
if ($ligne=~/^[^\t]+\t[^\t]+\t[^\t]+$/) {
#On supprime le caractère de saut de ligne
chomp($ligne);
#On remplit les listes
@malignesegmentee=split(/\t/,$ligne);
push(@listedetokens,$malignesegmentee[0]);
push(@listedelemmes,$malignesegmentee[1]);
push(@listedepos,$malignesegmentee[2]);
#On remplace la chaîne de caractères "NP" par la chaîne de caractères "NC"
$malignesegmentee[2]=~s/NP/NC/;
}
}
#On ferme le fichier d'entrée Cordial
close(FICTAG);
#-----------------------------------------------------------------------------------------------
#On affecte à une variable "$nom" la chaîne de caractères "resultat_bao3_cordial_"

my $nom="resultat_bao3_cordial_";
#On affecte à une variable "$extension" la chaîne de caractères ".txt"
my $extension=".txt";
#Pour chaque élément contenu dans la liste des patrons syntaxiques, on effectue les opérations suivantes
foreach my $element (@listedespatrons) {
#On affecte le contenu de la variable "$element" à une variable "$elem"
$elem=$element;
#On remplace les espaces contenus dans la variable "$elem" par des underscores
$elem=~s/ /_/g;
#On affecte à une variable "$output" le contenu de la variable "$nom", suivi du contenu de la variable "$elem", et suivi du contenu de la variable "$extension"
my $output=$nom.$elem.$extension;
#On ouvre en écriture le fichier de résultat dont le nom est contenu dans la variable "$output", sinon on affiche un message d'erreur
if (!open (FILEOUT,">$output")) {die "Probleme lors de l'ouverture du fichier $output"};
#-----------------------------------------------------------------------------------------------
#On cherche les suites de tokens qui correspondent au patron syntaxique
#-----------------------------------------------------------------------------------------------
#On affecte le contenu de la liste "@listedepos" dans une liste "@tmplistedespos"

my @tmplistedespos=@listedepos;
#On initialise une variable "$indice" à zéro
my $indice=0;
while (my $a=shift(@tmplistedespos)) {
#On segmente le patron pour connaitre son premier élément
my @listedeterme=split(/ /,$element);
#Si l'élément courant POS correspond au premier élément du patron, on effectue les opérations suivantes
if ($a=~/$listedeterme[0]/) {
#On regarde s'il y a correspondance pour la suite
my $verif=0;
for (my $i=0;$i<=$#listedeterme-1;$i++) {
if ($tmplistedespos[$i]=~/$listedeterme[$i+1]/) {
#Le suivant est bon aussi...
$verif++;
}
}
#Si la variable "$verif" est égale au nombre d'éléments du patron c'est qu'on a tout reconnu, on effectue donc les opérations suivantes
#On imprime les tokens en parallèle aux POS : La variable "$indice" permet de garder le parallèle entre POS et token

if ($verif==$#listedeterme) {
for (my $i=0;$i<=$#listedeterme;$i++) {
#On imprime dans le fichier de résultat la suite de tokens qui correspond au patron syntaxique
print FILEOUT $listedetokens[$indice+$i]," ";
}
#On imprime dans le fichier de résultat un retour à la ligne
print FILEOUT "\n";
}
}
#On incrémente la variable "$indice"
$indice++;
}
}