tef-innu

Transducteur à états finis de l’innu
git clone git://git.asteride.xyz/tef-innu.git
Journaux | Fichiers | Références

extension (1999B)


      1 #!/usr/bin/env python3
      2 #
      3 # tout.py -- Générer toutes les paires d’un transducteur
      4 #
      5 # -d - Diviseur de symboles
      6 # -s - Ne générer que le niveau supérieur
      7 # -i - Ne générer que le niveau inférieur
      8 # $1 - Chemin vers un transducteur (.att)
      9 
     10 import argparse
     11 
     12 analyseur = argparse.ArgumentParser()
     13 analyseur.add_argument("transducteur")
     14 analyseur.add_argument("-d")
     15 groupe = analyseur.add_mutually_exclusive_group()
     16 groupe.add_argument("-s", action="store_true")
     17 groupe.add_argument("-i", action="store_true")
     18 args = analyseur.parse_args()
     19 
     20 if args.s:
     21     afficher = lambda s, i: print(s)
     22 elif args.i:
     23     afficher = lambda s, i: print(i)
     24 else:
     25     afficher = lambda s, i: print(s + "\t" + i)
     26 
     27 if args.d == None:
     28     args.d = ""
     29 
     30 # Liste sans vide
     31 def sansvide(liste):
     32     return [e for e in liste if e]
     33 
     34 etats = [] # arc, sup, inf
     35 final = None
     36 with open(args.transducteur, 'r') as fichier:
     37     etat = None
     38     for ligne in fichier:
     39         champs = [champ.strip() for champ in ligne.split('\t') if champ]
     40         if len(champs) == 1:
     41             final = int(champs[0])
     42             break
     43         if champs[2] == "@0@":
     44             champs[2] = ""
     45         if champs[3] == "@0@":
     46             champs[3] = ""
     47         if champs[0] != etat:
     48             etats.append([])
     49         etats[-1].append((int(champs[1]), champs[2], champs[3]))
     50         etat = champs[0]
     51 netats = len(etats)
     52 
     53 pile = [(0, 0, 0, 0)] # etat, arc
     54 chaine_sup = []
     55 chaine_inf = []
     56 
     57 while pile:
     58     etat, arc, isup, iinf = pile.pop()
     59     if etat == final:
     60         afficher(args.d.join(sansvide(chaine_sup)),
     61                  args.d.join(sansvide(chaine_inf)))
     62         if etat == netats:
     63             continue
     64     if len(etats[etat]) != arc + 1: # pas encore de dernier arc
     65         pile.append((etat, arc + 1, isup, iinf))
     66     chaine_sup = chaine_sup[0:isup] + [etats[etat][arc][1]]
     67     chaine_inf = chaine_inf[0:iinf] + [etats[etat][arc][2]]
     68     isup = isup + 1
     69     iinf = iinf + 1
     70     pile.append((etats[etat][arc][0], 0, isup, iinf))