trafi

Transducteurs finis
git clone git://git.asteride.xyz/trafi.git
Journaux | Fichiers | Références

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:
Mtfd.c | 7++++++-
Mtfd.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