#########################################################################
#FLEMM-v2 -- French Lemmatizer : Lemmatisation du franais  partir de# 
#corpus tiquets - Version 2						#
#Copyright (C) 1999 (NAMER Fiammetta)					#
#########################################################################
# Module qui convertit l'entre en format interne,
# appelle le lemmatiseur et
# convertit le rsultat en format de Brill


# $Id: entrees_sorties,v 2 1999/08/31 07:56:28 namer Exp $

use English;
use strict qw(vars refs subs);

# Pre-declaration de variables globales
use vars qw($directory);

require "$main::directory/lemmatizer";

package entrees_sorties;

#use lib qw($ENV{BASE_LEM});


# ##########################################
# Mthodes de classe (utilises en externe)
############################################

sub new {
    my $type = shift;
    my ($path)=@_;
    
    my $self={};
    
    bless $self,$type;

    # Les objets de la classe prepare_agro  contiennent un objet
    # de la classe lemmatizer. C'est precisment celui-l que 
    # l'on cre  l'instruction suivante.

    $self->{"lemmatizer"}=new lemmatizer($path);


    return $self;
}

sub identifie {
    my $self = shift;
    my($entree0, $nb_brill, $filename) = @_;
    
    my($entree,$lex,$tag1,$tag, $lex_en_maj);

    my($debug0)=0;
    my($res)="";


    # Fichier rpertoriant les erreurs d'tiquetage

    if ($filename ne "") {
	open(OUT1,">>$filename.etiq") || die "$!";
	open(OUT2,">>$filename.seg") || die "$!";

	$debug0 = 1;
    }



    # Squence entre:
    $entree0 =~ /(.*)\/(.*)/;
    $lex=$1;
    $lex_en_maj=$1;
    $tag1=$2;


    # Transformation du mot en minuscules:
    $lex =~ tr/A-Z/a-z/;

    # 14 septembre : Suppression des signes de ponctuations 
    # en fin de mot, et des virgules au dbut

    if (($lex =~ /^([^\.\?!]+)(\.|!|\?|:)+$/) && 
        ($tag1 !~ /ABR/) &&
        ($tag1 ne "SBP")) {
	  $lex = $1;
	  print OUT2 "$lex_en_maj  est rduit  $lex ($tag1) \n";
        }


    if ($lex =~ /^(\.,|\-)+([^,\.]+)$/) {
        $lex = $2;
	  print OUT2 "$lex_en_maj  est rduit  $lex ($tag1) \n";
        }

    # Squence traite :
    $entree = $lex."/".$tag1;
 
    if ($entree =~ /ADJ$/) { 

	if ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	else {
		$res =  $self->iliad($entree0,$self->stemm_adjectif($entree),$nb_brill); 
	}
    }


    
    # Concerne PRO/PRV

    elsif ($entree =~ /(PRV|PRO)/) {

	if ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	elsif ($entree =~ /(-t)-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $lex = $2;
	    $entree =~ s/(.*)\/(.*)/$lex\/$2/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_pro($entree),$nb_brill);
	}


	elsif (($self->{"lemmatizer"}->est_un_pronom_personnel($lex)) ||
          ($self->{"lemmatizer"}->est_un_pronom_meme($lex)) ||
	    ($self->{"lemmatizer"}->est_un_pronom_invariable($lex))  ) {

	    $res = $self->iliad($entree0,$self->stemm_pro($entree),$nb_brill);
	}

	# Concerne PRV

	elsif (($tag1 =~ /PRV/) &&
	       ($lex =~ /^[jtsclm][e\']$/)) {
	    $res = $self->iliad($entree0,$self->stemm_pro($entree),$nb_brill);
	}


	# Concerne PRV

	elsif (($tag1 =~ /PRV/) &&
	       ($lex =~ /^(l'_on$|-t-|-ce|-il)/)) {
	    $res = $self->iliad($entree0,$self->stemm_pro($entree),$nb_brill);
	}

	# Concerne PRV

	elsif ($tag1 =~ /PRV/) {

	    # Premiere approximation : si PRV echoue, alors c'est un ADJ

	    $entree =~ s/(.*)\/(.*)/$1\/ADJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
	    $res = $self->iliad($entree0,$self->stemm_adjectif($entree),$nb_brill);
	}
	    
	# Concerne PRO

	elsif  ($lex =~ /(ae|ashe|[0-9]|ante?|[oiay]que|[ai]ble|iche)s?$/) {
	    $entree =~ s/(.*)\/(.*)/$1\/ADJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_adjectif($entree),$nb_brill);
	}

	# Concerne PRO

	elsif  (($lex =~ /(thrapie|ose|ate)s?$/)&&($lex !~ /quelque_chose/)) {
	    $entree =~ s/(.*)\/(.*)/$1\/SBC/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}
	# Concerne PRO

	else {
	    $res = $self->iliad($entree0,$self->stemm_pro($entree),$nb_brill);
	} 
	    
    }


    elsif ($entree =~ /SBP\?/) {
    
      # Le 14 septembre
      if ($entree !~ /^rendez-vous/) {
	    $entree =~ s/(.*)\/(.*)/$1\/SBC/;

	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}

	elsif ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	elsif ($lex =~ /(nine|oside|tion|mie|logie|[ai]bilit|age|isme|[ae]nce|tu[rd]e|mtrie|ose|ase|mycte|ement)s?$/) {

	    $entree =~ s/(.*)\/(.*)/$1\/SBC/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}

	elsif ($lex =~ /(mique|iste|logique|[ai]ble|phile|[ae]nte|mtre|teur|trice|ire)s?$/) {
	   
	    $entree =~ s/(.*)\/(.*)/$1\/ADJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
	    $res = $self->iliad($entree0,$self->stemm_adjectif($entree),$nb_brill);
	}
 
	else {

	    $res = $self->iliad($entree0,$entree,$nb_brill);
	}
    }

    elsif ($entree =~ /SBP$/) {

	if ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}
      else {

	    $res = $self->iliad($entree0,$entree,$nb_brill);
	}
    }

    elsif ($entree =~ /(DTN|REL|DTC)/) {

	if (($self->{"lemmatizer"}->est_un_determinant_ou_une_relative_invariable($lex)) ||
	    ($lex =~ /(quel|^une?$|^des$|^les?$|^la$|^[ld]\'$|^aux?$|^du$|^ce|^[mts](ien(ne)?s?|on|a|es)$|^[nv](os|otre)$|^leurs?|^tel|^nul|^tou|^certain|^aucun)/)) {

	    $res = $self->iliad($entree0,$self->stemm_detrel($entree),$nb_brill);
	}
	
	elsif ($lex =~ /_de$/) {
	    $entree =~ s/(.*)\/(.*)/$1\/PREP/;
	    $entree0 =~ s/(.*)\/(.*)/$1\/PREP/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;


	    $res = $self->iliad($entree0,$entree,$nb_brill);
	}

	else {
	    $entree =~ s/(.*)\/(.*)/$1\/SBC/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}
	    
    }



    elsif ($entree =~ /(VNCNT|ANCNT|ENCNT)/) {

	if ($entree =~ /ante?s?\//) {
	    $res = $self->iliad($entree0,$self->stemm_ppres($entree),$nb_brill);
	}
	elsif ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	else {
	    $entree =~ s/(.*)\/(.*)/$1\/ADJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;
	    
	    $res = $self->iliad($entree0,$self->stemm_adjectif($entree),$nb_brill);
	}
    }
    
    elsif  ($entree =~ /SBC/) {

      # Le 14 septembre
      if ($entree =~ /^rendez-vous/) {

	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}


	elsif ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;


	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	else {
	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}
    }

    elsif ($entree =~ /(APAR|EPAR)/) {

	$res = $self->iliad($entree0,$self->stemm_ppasts($entree),$nb_brill);
    }

    # Tester les terminaisons potentielles des participes passs

    elsif ($entree =~ /(ADJ1PAR|VPAR|ADJ2PAR)/)  {

      if ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	elsif (($entree =~ /^(ha|ou)(e|es|s)?\//) ||
	    ($entree =~ /^mort(e|es|s)?\//) ||
	    ($entree =~ /(sous|soutes?)\//) ||
	    ($entree =~ /(clos|[^a]is|clus)(e|es)?\//) ||
	    ($entree =~ /(|[^oa]i|[^aq]u||[vf]ert|[aeo]int|(f|tr)ait|(d|cr|f|fr|c|cu|du|lu|nu|ru)it)(e|es|s)?\//)) {
	    $res = $self->iliad($entree0,$self->stemm_ppasts($entree),$nb_brill);
	}
	else {
	    $entree =~ s/(.*)\/(.*)/$1\/ADJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
	    $res = $self->iliad($entree0,$self->stemm_adjectif($entree),$nb_brill);
	}
    }

    # Tester les terminaisons potentielles des verbes a l'infinitif

    elsif ($entree =~ /VNCFF/)  {

	if ($entree =~ /(.*[^\-].?)(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;
	    $entree =~ s/(.*)\/(.*)/$1\/VCJ/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    $res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	}

	elsif (($entree =~ /cl[ou]re\//) ||
	    ($entree =~ /[e]r\//) ||
	    ($entree =~ /[^aeiy]ir\//) ||
	    ($entree =~ /[^aefghjklmnoqsuwxyz]re\//) ) {
	    $res = $self->iliad($entree0,$entree,$nb_brill);
	}
	else {
	    $entree =~ s/(.*)\/(.*)/$1\/SBC/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}
    }

    elsif ($entree =~ /(ACJ|ECJ)/) {
	$res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
    }

    # Tester les terminaisons potentielles des verbes
    elsif ($entree =~ /VCJ/) {

	    $entree =~ s/(-t)?-(je|tu|ils?|elles?|nous|vous|on)\//\//;

	if (($entree =~ /^vont\//) ||
	    ($entree =~ /^(contre)?fou[st]\//) ||
	    ($entree =~ /^(ou|ha)[st]\//) ||
	    ($entree =~ /^meur[st]\//) ||
	    ($entree =~ /^(con)?vaincs?\//) ||
	    ($entree =~ /[rf]ont\//) ||
	    ($entree =~ /(a|ai|as|t)\//) ||	    
	    ($entree =~ /clo[st]\//) ||
	    ($entree =~ /(e|es|is|it|ons|ez)\//) ||
	    ($entree =~ /[cm]ouds?\//) ||
	    ($entree =~ /[bs]sou[st]\//) ||
	    ($entree =~ /[^aefgijkquwxyzo][u][st]\//) ||
	    # 14 septembre
	    ($entree =~ /(en|par|er|[im]eu|[sd]or|cour|[veaot]in)[st]\//) ||
	    ($entree =~ /([eao]nd|[oe]rd|rompt|sied|vt|[bm][ae]t)s?\//) ||
	    ($entree =~ /[fvpl][ea]u[xt]\//) ||
	    ($entree =~ /(pla|na|para|pa|cro)t\//)) {

	    if ($entree =~ /(gi|[^g]e|a|au)(a|ai|as|t)\//) {
		$entree =~ s/(.*)\/(.*)/$1\/SBC/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
		$res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	    }
	    else {
		$res = $self->iliad($entree0,$self->stemm_verbe($entree),$nb_brill);
	    }

	}
	else {
	    $entree =~ s/(.*)\/(.*)/$1\/SBC/;
	    print OUT1 "$lex_en_maj / $tag1 ==>  $entree\n" if $debug0;

	    
	    $res = $self->iliad($entree0,$self->stemm_nom($entree),$nb_brill);
	}
	
    }
    
    else  {
	$res = $self->iliad($entree0,$entree,$nb_brill);
    }
	
    close(OUT1);
    close(OUT2);


    return $res;
}		 

#######################################################

sub stemm_detrel {
    my $self=shift;

    my($a) = @_;
    
    my($lex,$b,$cat);
    
    my($res)="";
    
    $a=~ /^(.*)\/(DTN|REL|DTC)$/;
    
    $lex=$1;
    $cat = $2;
    
    $b= $self->{"lemmatizer"}->lemme_detrel($lex,$cat);

    $res = $cat." ".$lex." / ".$b;
    return $res;
}


sub stemm_pro {
    my $self = shift;
    my($a) = @_;
    
    my($lex,$etiq,$b);
    
    my($res)="";
    
    $a=~ /^(.*)\/(PRO|PRV)$/;
    
    $lex=$1;
    $etiq=$2;

    $b= $self->{"lemmatizer"}->lemme_pro($lex);

    $res = $etiq." ".$lex." / ".$b;
    return $res;
}


sub stemm_adjectif {
    my $self=shift;
    my($a) = @_;
    
    my($lex,$b);
    
    my($res) = "";
    
    $a=~ /^(.*)\/ADJ$/;
    
    $lex=$1;

    $b= $self->{"lemmatizer"}->lemme_adj($lex);

    $res = "ADJ ".$lex." / ".$b;
    return $res;
}

sub stemm_ppres {
    my $self=shift;

    my($a) = @_;
    
    my($lex,$cat,$b);
    
    my($res) = "";
    
    $a=~ /^(.*)\/(VNCNT|ANCNT|ENCNT)$/;
    
    $lex=$1;
    $cat=$2;

    $b= $self->{"lemmatizer"}->lemme_ppres($lex);

    $res = $cat." ".$lex." / ".$b;
    return $res;
}

sub stemm_ppasts {
    my $self=shift;

    my($a) = @_;
    
    my($lex,$cat,$b);

    my($res)="";

    $a=~ /^(.*)\/(ADJ1|ADJ2|APAR|EPAR|VPAR)(.*)$/;

    $lex=$1;
    $cat=$2.$3;

    $b= $self->{"lemmatizer"}->lemme_ppast($lex);

    $res = $cat." ".$lex." / ".$b;
    return $res;
}

sub stemm_nom {
    my $self=shift;

    my($a) = @_;

    my($lex,$b);

    my($res) = "";

    $a=~ /^(.*)\/SBC$/;


    $lex=$1;

    $b= $self->{"lemmatizer"}->lemme_nom($lex);
    $res = "SBC ".$lex." / ".$b;
    return $res;
}


sub stemm_verbe {
    my $self=shift;

    my($a) = @_;

    my($lex,$cat,$b);

    my($res) = "";

    $a=~ /^(.*)\/(ACJ|ECJ|VCJ)$/;

    $lex=$1;
    $cat=$2;

    $b= $self->{"lemmatizer"}->lemme_verbe($lex);

    $res = $cat." ".$lex." / ".$b;

	
    return $res;
    
}

sub iliad {
    my $self=shift;
    my($entree0,$entree,$nb_brill)= @_;

    my($etiq,$lex,$lex0,$lem,$deb,$reste, $reste0);

    my($res);



    $entree0 =~ /(.*)\/(.*):?.?.?$/;
    $lex0 = $1;
    $reste0 = $2;

    #print "$entree\n";
    if ($entree =~ /[^e]\'\/(ADV|PREP|SUB\$?)$/) {
	$entree =~ s/\'(\/)/e\1/;
    }
    
    # Par dfaut le lemmatiseur produit une
    # analyse non dterministe pour "taient 
    # (tre/tayer)". Correction par rapport 
    # Brill o la catgorie est diffrente.

    if ($entree =~ /^ECJ taient/) {
	$entree = "ECJ taient / tre, 3ppIMP, (3e groupe)";
    }
    
    if (($entree !~ /^ADJ /) &&
	($entree !~ /PAR /) &&
	($entree !~ /^DTN /) &&
	($entree !~ /^DTC /) &&
	($entree !~ /^REL /) &&
	($entree !~ /^PRO /) &&
	($entree !~ /^PRV /) &&
	($entree !~ /^SBC /) &&
	($entree !~ /^ACJ /) &&
	($entree !~ /^ECJ /) &&
	($entree !~ /^VCJ /) &&
	($entree !~ /NCNT /)) {
	
	$entree =~ /(.*)\/(.*):?.?.?$/;
	$lex = $1;
      # 11 aout 99
      #$lex =~ s/\'/e/;
	$res  = $lex0."/".$reste0."/".$lex;
    }
    
    # On remplace les squences de blancs par une virgule 
    # (sauf mots composs avec "'")
    
    else {
	$entree =~ /^([^ ]*) (.*) \/ (.*)$/;
	$etiq = $1;
	$lex = $2;
	$lem=$3;
	
	# Si le mot contient des blanc, en tenir compte
	
	if (($lex =~ / /) && ($etiq =~ /VCJ/)) {
	    $lem =~ /^([^ ]*) ([^ ]*)([ ,])(.*)$/;
	    $deb = $1." ".$2;
	    $reste = $3.$4;
	    $reste =~ s/ /,/g;
	    $lem = $deb.$reste;
	}
	elsif ($lex !~ / /) {
	    
	    # on uniformise les sparateurs
	    $lem =~ s/ /,/g;
	}
	
	$lem =~ s/,,+/,/g;
	
	# On distingue les lignes contenant " ou ":
	if ($lem =~ /,ou,/) {
	    
	    $res = $self->distribue_ou($lex0,$lem,$lex,$etiq,$nb_brill);
	    
	}	
	
	# traitement de notation proprement dit
	else {
	    $lem =~ s/,/:/g;
	    $res = $self->decompose($etiq,$lem,$nb_brill);
	    $res = $lex0."/".$etiq.":".$res;

	    if ($res =~ /^(.*)XXX\/(.*)$/) {

		$res = $1."XXX/".$lex0;
	    }
	}
    }
	
    return $res;
}

sub distribue_ou {
    my $self=shift;
    my($lex0,$seq,$lex,$etiq,$nb_brill) = @_;

    my($forme_mot1,$groupe1,$flex1,$forme_mot2,$groupe2,$flex2);

    my($res)="";

    if ($etiq =~ /NCNT/) {
	$seq =~ /^([^,]*),(\([^\)]*\)),ou,([^,]*):(..):(\([^\)]*\)),?$/;
	$forme_mot1 = $1;
	$flex1 = $4;
	$groupe1 = $2;
	$forme_mot2 = $3;
	$flex2 = $flex1;
	$groupe2 = $5;
	
	$res = "{".$lex0."/".$etiq.":".$self->decompose($etiq,$forme_mot1.":".$flex1.":".$groupe1,$nb_brill);
	$res .= "|";
	$res .= $lex0."/".$etiq.":". $self->decompose($etiq, $forme_mot2.":".$flex2.":".$groupe2,$nb_brill)."}";
	
    }
    
    elsif ($etiq =~ /CJ/) {
	if ($seq =~ /^([^,]*),([1-3][^,\( ]*),(\([^\)]*\)),ou,([^,]*),([1-3][^,\( ]*),(\([^\)]*\)),?$/) {
	    
	    $forme_mot1 = $1;
	    $flex1 = $2;
	    $groupe1 = $3;
	    $forme_mot2 = $4;
	    $flex2 = $5;
	    $groupe2 = $6;
	}
	elsif  ($seq =~ /^([^,]*),(\([^\)]*\)),ou,([^,]*),(\([^\)]*\)),([1-3][^,]*),?$/) {
	    $forme_mot1 = $1;
	    $flex1 = $5;
	    $groupe1 = $2;
	    $forme_mot2 = $3;
	    $flex2 = $flex1;
	    $groupe2 = $4;
	}
	elsif  ($seq =~ /^([^,]*),([1-3][^, ]*),ou,([^,]*),([1-3][^,\( ]*),(\([^\)]*\)),?$/) {
	    $forme_mot1 = $1;
	    $flex1 = $2;
	    $groupe1 = $5;
	    $forme_mot2 = $3;
	    $flex2 = $4;
	    $groupe2 = $groupe1;
	}
	elsif  ($seq =~ /^([^ ]*),ou,([^,]*),([1-3][^, ]*),(\([^\)]*\)),?$/) {
	    $forme_mot1 = $1;
	    $flex1 = $3;
	    $groupe1 = $4;
	    $forme_mot2 = $2;
	    $flex2 = $flex1;
	    $groupe2 = $groupe1;
	}
	
	else {
	    #print "Notation de base incorrecte, verbe $lex\n";
	}
	
	$res = "{".$lex0."/".$etiq.":".$self->decompose($etiq,$forme_mot1.":".$flex1.":".$groupe1,$nb_brill);
	$res .= "|";
	$res .= $lex0."/".$etiq.":". $self->decompose($etiq, $forme_mot2.":".$flex2.":".$groupe2,$nb_brill)."}";
	
    }
    else {
	#Extention aux noms/adjectifs
	if  ($seq =~ /^([^,:]*):([mf_])([sp_])[:,]ou[:,]([^,:]*)[,:]([mf_])([sp_])[:,]?$/) {
	    $forme_mot1 = $1;
	    $flex1 = $2.$3;
	    $forme_mot2 = $4;
	    $flex2 = $5.$6;
	}
	elsif  ($seq =~ /^([^,:]*)[:,]ou[:,]([^,:]*):([mf_])([sp_])[:,]?$/) {
	    $forme_mot1 = $1;
	    $flex1 = $3.$4;
	    $forme_mot2 = $2;
	    $flex2 = $flex1;
	}
	
	else {
	    #print "Notation de base incorrecte, nom $lex\n";
	}
	
	$res = "{".$lex0."/".$etiq.":".$self->decompose($etiq,$forme_mot1.":".$flex1,$nb_brill);
	$res .= "|";
	$res .= $lex0."/".$etiq.":". $self->decompose($etiq,$forme_mot2.":".$flex2,$nb_brill)."}";
	
    }
    
    return $res;
}

# Affiche le mot lemmatise selon les conventions suivantes:
#
# pour les verbes conjugues (VCJ) :
# MotFlechi/Etiq:pers:nb:tps:mode/LemmeCalcule:gpe:FamilleFlex/
#
# pour les participes, les adjectifs, les noms, les determinants et 
# les pronoms relatifs (PPRES/PPAST/ADJ/SBC/DTN/REL) :
# MotFlechi/Etiq:genre:nb/LemmeCalcule:FamilleFlex/
#
# Pour les pronoms (PRO/PRV)
# MotFlechi/Etiq:pers:genre:nb:cas/LemmeCalcule:FamilleFlex/
#
# Valeurs possibles :
#
# pers : 1p,2p,3p,_
# genre : m,f,_
# nb : s,p,_
# tps : pst,impft,fut, ps
# mode : ind,subj,imp,cond,imper
# gpe : 1g,2g,3g
# FamilleFlex : _
#
# Pour chacune de ses realisations, les resultats ambigus 
# sont entre separes par '|' et places entre {}:
#
# ex1 :  {bruissant/PPRES:m:s/bruisser:1g/|bruissant/PPRES:m:s/bruire:3g/}
#
# ex2 : allions/VCJ:1p:{impft:ind|pst:subj}/aller:3g/
#

sub decompose {
    my $self=shift;
    my($etiq, $seq,$nb_brill) =@_;

    my(@tab);
    my($flex,$gd,$nb,$modele,$tps,$cas);
    my($per)="";
    my($res)="";
    my($famille_flex) =":_";

    # Valeur indtermine par dfaut pour $nb_brill

    if (($nb_brill ne "sg")&&
	($nb_brill ne "pl")) {
	$nb_brill = "_";
    }
    else {
	$nb_brill =~ s/(.).$/$1/;
    }

    @tab = split(':',$seq);

    # Calcul de la famille flexionnelle 
    # $famille_flex = $self->calcule_modele_flex($etiq, $tab[0]);

    $flex = $tab[1];

    # Les pronoms :

    if ($flex =~ /^([123_])([mf_])([sp_])([_naodMRSTU])$/) {

	$per=$1;
	$gd=$2;
	$nb=$3;

	# Raffinage de la valeur du nombre en substituant
	#  la valeur indtermine la valeur calcule par Brill.

	 
	if ($nb eq "_") {
	    $nb=$nb_brill;
	}

	$res = $per."p:".$gd.":".$nb.":";
	$cas = $4;
	if ($cas =~ /[_naod]/) {
	    $res .= $cas."/";
	}
	elsif ($cas =~ /M/) {
	    $res .= "{n|d|o}/";
	}
	elsif ($cas =~ /U/) {
	    $res .= "{a|d|o}/";
	}
	elsif ($cas =~ /R/) {
	    $res .= "{a|d}/";
	}
	elsif ($cas =~ /S/) {
	    $res .= "{a|o}/";
	}
	else {
	    # cas = T = d/o
	    $res .= "{d|o}/";
	}
    }

    # Dterminants, adjectifs, noms, participes passs

    elsif ($flex =~ /^([mf_])([sp_])$/) {
	$gd=$1;
	$nb=$2;
	
	# Raffinage de la valeur du nombre en substituant
	#  la valeur indtermine la valeur calcule par Brill.

	 
	if ($nb eq "_") {
	    $nb=$nb_brill;
	}

	$res = $gd.":".$nb."/";
    }

    elsif ($flex =~ /^([sp_])$/) {
	$nb=$1;
	# Raffinage de la valeur du nombre en substituant
	#  la valeur indtermine la valeur calcule par Brill.

	 
	if ($nb eq "_") {
	    $nb=$nb_brill;
	}
	$res = "_:".$1."/";
    }

    # Verbes conjugus :
    elsif ($flex =~ /^([1-3])\/?([1-3]?).(.)(.*)$/) {
	$res = $1;
	$per = $2;
	$nb = $3;

	# Raffinage de la valeur du nombre en substituant
	#  la valeur indtermine la valeur calcule par Brill.

	 
	if ($nb eq "_") {
	    $nb=$nb_brill;
	}

	$tps = $4;
	if ($per ne "") {
	    $res = "{".$res."|".$per."}";
	}
	$res .= "p:".$nb.":";

	if ($tps =~ /^(IMP\/PSTSUBJ|PSTSUBJ\/IMP)$/) {
	    $res .="{impft:ind|pst:subj}/";
	}
	elsif ($tps =~ /^(PSTIND\/SUBJ\/IMPER)$/) {
	    $res ="{".$res."pst:{ind|subj}|2p:s:pst:imper}/";
	}
	elsif ($tps =~ /^(PSTIND\/IMPER)$/) {
	    if ($flex =~ /ps/) {
		$res ="{".$res."pst:ind|2p:s:pst:imper}/";
	    }
	    else {
		$res .= "pst:{ind|imper}/";
	    }
	}
	elsif ($tps =~ /^(PSTSUBJ\/IMPER)$/) {
	    if ($flex =~ /ps/) {
		$res ="{".$res."pst:subj|2p:s:pst:imper}/";
	    }
	    else {
		$res .= "pst:{subj|imper}/";
	    }
	}
	elsif ($tps =~ /^(IMPER)$/) {
	    if ($flex =~ /ps/) {
		$res ="2p:s:pst:imper/";
	    }
	    else {
		$res .= "pst:imper/";
	    }
	}
	elsif ($tps =~ /^PST(_|IND\/SUBJ)?$/) {
	    $res .="pst:{ind|subj}/";
	}
	elsif ($tps =~ /^PS\/PSTIND$/) {
	    $res .="{pst|ps}:ind/";
	}
	elsif ($tps =~ /^PSTIND\/PS\/IMPER$/) {
	    $res ="{".$res."{pst|ps}:ind|2p:s:pst:imper}/";
	}
	elsif ($tps =~ /^PSTIND$/) {
	    $res .="pst:ind/";
	}
	elsif ($tps =~ /^PSTSUBJ$/) {
	    $res .="pst:subj/";
	}
	elsif ($tps =~ /^SUBJIMP$/) {
	    $res .="impft:subj/";
	}
	elsif ($tps =~ /^PS$/) {
	    $res .="ps:ind/";
	}
	elsif ($tps =~ /^IMP$/) {
	    $res .="impft:ind/";
	}
	elsif ($tps =~ /^FUT$/) {
	    $res .="fut:ind/";
	}
	elsif ($tps =~ /^COND$/) {
	    $res .="pst:cond/";
	}
	else {
	    $res .="xxx:xxx/";
	}
    }
    else {
	$res = "XXX/";

    }
    $res .= $tab[0];
    if (defined($tab[2])) {

	$modele = $tab[2];
	$modele =~ /^\(([1-3])/;
	$res .= ":".$1."g";
    }
    #$res .= $famille_flex."/";
   
    return $res;
}

1;

