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))