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