commit 4c845ad81e7ded88b812e4d0a5bfb0da386a06db
parent 2af9a4859db016f94df56eb39f6d3ea1f87e58fd
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date: Wed, 8 Apr 2026 21:49:29 -0400
Désactiver les paires vides du segmenteur
Diffstat:
| M | tfd.c | | | 7 | ++++++- |
| M | tfd.h | | | 26 | +++++++++++++------------- |
2 fichiers modifiés, 19 insertions(+), 14 suppressions(-)
diff --git a/tfd.c b/tfd.c
@@ -135,7 +135,7 @@ segmenteur(struct tfm *tfm)
uint32_t *finaux; /* Symboles correspondants aux états finaux. */
size_t (*pile)[2]; /* Pile: (indice dans segm, état). */
ssize_t ipile; /* Indice dans la pile. */
- uint16_t isegm; /* Indice dans le segmenteur. */
+ size_t isegm; /* Indice dans le segmenteur. */
size_t ietat, ntrans, itrans;
ssize_t base;
unsigned char c;
@@ -202,6 +202,11 @@ segmenteur(struct tfm *tfm)
tampex_libr(finaux);
tampex_libr(pile);
+ /* Désactiver les paires vides. */
+ for (isegm = 0; tampex_dedans(segm, isegm); isegm++)
+ if (segm[isegm][0] == 0)
+ segm[isegm][1] = (0 << 1) | 0x01;
+
return segm;
erreur3:
diff --git a/tfd.h b/tfd.h
@@ -28,8 +28,8 @@
* 0A 0D Taille de la liste des symboles
* 0e 11 Décalage du segmenteur
* 12 15 Taille du segmenteur
- * 16 19 Décalage de l’automate
- * 1a 1d Taille de l’automate
+ * 16 19 Décalage du transducteur
+ * 1A 1D Taille du transducteur
*/
#define TFD_MAGIQUE 0x5407
@@ -49,17 +49,17 @@
* La structure du segmenteur s’inspire de la structure à deux tableaux
* proposée par Aho (1989: « An Efficient Digital Search Algorithm by Using a
* Double-Array Structure »). Elle consiste en un tableau dont les cellules
- * contiennent chacune chacune deux champs: la base (0) et l’origine (1).
- * Chaque champ occupe 2 octets, pour un total de 4 octets par cellule. Ces
- * deux champs contiennent un drapeau dans leur bit de poids faible. Celui de
- * la base marque un état comme final (1) ou comme non-final (0); celui de
- * l’origine indique si le champ doit bel et bien être interprété comme une
- * origine (0), ou comme un identifiant de symbole. Le champ base doit avoir
- * une valeur supérieure à 0, sauf si le bit de poids faible est activé: alors,
- * c’est signe que l’état ne contient pas de transition sortante. Une paire
- * (base, origine) représente un état. Un état peut être désigné par son indice
- * i. On passe d’un état à l’autre par la formule
- *
+ * contiennent chacune deux champs: la base (0) et l’origine (1). Chaque champ
+ * occupe 2 octets, pour un total de 4 octets par cellule. Ces deux champs
+ * contiennent un drapeau dans leur bit de poids faible. Celui de la base
+ * marque un état comme final (1) ou comme non-final (0); celui de l’origine
+ * indique si le champ doit bel et bien être interprété comme une origine (0),
+ * ou comme un identifiant de symbole. Le champ base doit avoir une valeur
+ * supérieure à 0, sauf si le bit de poids faible est activé: alors, c’est
+ * signe que l’état ne contient pas de transition sortante. Une paire (base,
+ * origine) représente un état. Un état peut être désigné par son indice i. On
+ * passe d’un état à l’autre par la formule
+ *
* i' = (segm[i][0] >> 1) + s,
*
* où s est un symbole d’entrée. Pour que la transition soit valide, les