tef-innu

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

commit 1df7d47cd23d86a81f1987307534e866c7387425
parent d1b52ebc4f1ba138c4d24034e809d490f7c0557a
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Tue,  2 Dec 2025 17:16:09 -0500

[chm] Rendre bin/extension.py plus polyvalent

Trois options de ligne de commande ont été ajoutées. -d [div] intercale
la chaîne [div] entre les symboles des chaînes, -s n’affiche que la
chaîne du niveau supérieur et -i que celle du niveau inférieur. Ces deux
dernières options sont naturellement mutuellement exclusives.

Diffstat:
Mbin/extension.py | 46++++++++++++++++++++++++++++++++++++----------
1 fichier modifié, 36 insertions(+), 10 suppressions(-)

diff --git a/bin/extension.py b/bin/extension.py @@ -2,13 +2,38 @@ # # tout.py -- Générer toutes les paires d’un transducteur # +# -d - Diviseur de symboles +# -s - Ne générer que le niveau supérieur +# -i - Ne générer que le niveau inférieur # $1 - Chemin vers un transducteur (.att) -import sys +import argparse + +analyseur = argparse.ArgumentParser() +analyseur.add_argument("transducteur") +analyseur.add_argument("-d") +groupe = analyseur.add_mutually_exclusive_group() +groupe.add_argument("-s", action="store_true") +groupe.add_argument("-i", action="store_true") +args = analyseur.parse_args() + +if args.s: + afficher = lambda s, i: print(s) +elif args.i: + afficher = lambda s, i: print(i) +else: + afficher = lambda s, i: print(s + "\t" + i) + +if args.d == None: + args.d = "" + +# Liste sans vide +def sansvide(liste): + return [e for e in liste if e] etats = [] # arc, sup, inf final = None -with open(sys.argv[1], 'r') as fichier: +with open(args.transducteur, 'r') as fichier: etat = None for ligne in fichier: champs = [champ.strip() for champ in ligne.split('\t') if champ] @@ -25,20 +50,21 @@ with open(sys.argv[1], 'r') as fichier: etat = champs[0] netats = len(etats) -pile = [(0, 0, 0, 0)] # etat, arc, isup, iinf -chaine_sup = "" -chaine_inf = "" +pile = [(0, 0, 0, 0)] # etat, arc +chaine_sup = [] +chaine_inf = [] while pile: etat, arc, isup, iinf = pile.pop() if etat == final: - print(chaine_sup + "\t" + chaine_inf) + afficher(args.d.join(sansvide(chaine_sup)), + args.d.join(sansvide(chaine_inf))) if etat == netats: continue if len(etats[etat]) != arc + 1: # pas encore de dernier arc pile.append((etat, arc + 1, isup, iinf)) - chaine_sup = chaine_sup[0:isup] + etats[etat][arc][1] - chaine_inf = chaine_inf[0:iinf] + etats[etat][arc][2] - isup = isup + len(etats[etat][arc][1]) - iinf = iinf + len(etats[etat][arc][2]) + chaine_sup = chaine_sup[0:isup] + [etats[etat][arc][1]] + chaine_inf = chaine_inf[0:iinf] + [etats[etat][arc][2]] + isup = isup + 1 + iinf = iinf + 1 pile.append((etats[etat][arc][0], 0, isup, iinf))