trafi

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

commit 1391d1083f7d84e0d485ccf8e05559b39a2fb2bb
parent b68fefc0121d0e9da9b75826d8d9f4d8812bb1b1
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Fri, 10 Apr 2026 16:38:16 -0400

Mettre à jour la documentation du format tfd

Diffstat:
Mtfd.h | 136+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
1 fichier modifié, 84 insertions(+), 52 suppressions(-)

diff --git a/tfd.h b/tfd.h @@ -6,66 +6,76 @@ #include "tfm.h" /* Le format .tfd est une représentation binaire d’un transducteur fini. Il a - * été conçu pour être rapide à charger et à interpréter: nul besoin de le - * désérialiser pour l’interpréter, et les structures de données qu’il utilise - * dispensent d’un maximum de recherche. L’absence de sérialisation et de - * désérialisation limite la portabilité du fichier. En particulier, le format - * utilise le boutisme de l’hôte qui l’a compilé. - * - * Le format est composé de trois segments, indexés dans une entête placée en - * début de fichier. Les segments sont les suivants: - * - * - liste des symboles, - * - segmenteur - * - automate - * + * été conçu pour être rapide à charger et à interpréter. En particulier, son + * contenu n’a pas besoin d’être désérialisé pour être interprété. En revanche, + * l’absence de sérialisation limite la portabilité du fichier, car le boutisme + * de presque toutes les valeurs qu’il contient suivent le boutisme de l’hôte + * qui l’a compilé. + * + * Le format comprend une entête et trois segments. L’entête contient des + * informations sur le fichier, de même que l’emplacement et la longueur de + * chacun des trois segments. Les segments sont les suivants: liste des + * symboles, segmenteur et transducteur. + * * L’entête contient les champs suivants: * - * 00 01 Nombre magique (0h5407) - * 02 03 Version (0) + * 00 01 Nombre magique (0h5407) (petit-boutisme) + * 02 03 Version (0) (petit-boutisme) * 04 05 Témoin de boutisme (0h00FF) - * 06 09 Décalage de la liste des symboles - * 0A 0D Taille de la liste des symboles - * 0e 11 Décalage du segmenteur - * 12 15 Taille du segmenteur - * 16 19 Décalage du transducteur - * 1A 1D Taille du transducteur + * 06 09 Emplacement de la liste des symboles + * 0A 0D Longueur de la liste des symboles + * 0e 11 Emplacement du segmenteur + * 12 15 Longueur du segmenteur + * 16 19 Emplacement du transducteur + * 1A 1D Longueur du transducteur + * + * Le nombre magique (0h5407) sert à identifier un fichier comme un fichier au + * format tfd. Le champ suivant indique la version du format utilisé. Le témoin + * de boutisme permet de détecter le boutisme de l’hôte qui a compilé le + * format. Celui-ci doit écrire 0h00FF dans ce champ. Le programme interpréteur + * peut alors vérifier si le boutisme du fichier est compatible avec + * l’architecture sur laquelle il tourne. S’il lit 0h00FF, il est compatible, + * sinon il lira 0hFF00 et saura que le boutisme est mauvais. Le sens des + * paires emplacement/longueur va de soi. */ -#define TFD_MAGIQUE 0x5407 -#define TFD_VERSION 0 -#define TFD_TEMOIN 0x00FF -#define TFD_ENTETE_TLL 0x1E +#define TFD_MAGIQUE 0x5407 /* Nombre magique. */ +#define TFD_VERSION 0 /* Version courante. */ +#define TFD_TEMOIN 0x00FF /* Témoin de boutisme. */ +#define TFD_ENTETE_TLL 0x1E /* Taille de l’entête. */ -/* La liste des symboles se présente comme une suite chaînes de caractères +/* La liste de symboles et le segmenteur de symboles permettent au transducteur + * de manipuler des symboles de plusieurs octets. Les identifiants de symbole + * renvoyés par le segmenteur et reçus et renvoyés par le transducteur sont des + * indices dans la liste de symboles. + * + * La liste des symboles se présente comme une suite chaînes de caractères * encodées à la Pascal, dans lesquelles les chaînes sont immédiatement - * précédées d’un octet donnant la taille de la chaîne le suivant. - * - * La liste des identifiants de symbole d’entrée sont une suite d’adresses - * relatives au début de la liste des symboles. Ces sont par ces indices que - * les symboles d’entrée sont identifiés dans le segmenteur et dans le - * transducteur. Elle facile la recherche dans le transducteur. - * - * 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 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 + * précédées d’un octet non-signé donnant la taille de la chaîne le suivant. La + * longueur maximale d’un symbole est donc de 255 octets. Les symboles de + * longueur 0 sont interdits. + * + * Le segmenteur sert à décomposer la chaîne de caractères d’entrée en chaîne + * de symboles intelligibles au transducteur. Sa structure 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 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) peut être désignée par son indice i. On + * passe d’une paire à 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 * conditions suivantes doivent aussi être satisfaites: * - * (segm[i'][1] & 1) == 0, + * (segm[i'][1] & 0x01) == 0, * (segm[i'][1] >> 1) == i. * * Autrement, on pourrait quitter n’importe quel état avec n’importe quel @@ -83,8 +93,8 @@ * * Enfin, si * - * (segm[i][0] & 1) == 1 et - * (segm[i][0] >> 1) == 0, + * (segm[i][0] & 0x1) == 1 et + * (segm[i][0] >> 1) == 0, * * c’est que l’état ne compte aucune transition sortante. * @@ -94,10 +104,32 @@ * reconnaître le symbole le plus long, ignorant ses préfixes qui sont aussi * des symboles. Lorsque plus aucune transition n’existe qui n’accepte le * prochain symbole d’entrée, le dernier symbole assigné est retourné et la - * position dans le mot entrée courante au moment où ce symbole a été assigné - * est restorée. + * position dans le mot courante au moment où ce symbole a été assigné est + * restorée. + * + * Le transducteur fini est représenté suite d’états, eux-mêmes constitués + * d’une liste de transitions sortantes précédée d’une entête. L’entête d’un + * état occupe 8 octets. + * + * 00 01 Nombre de transitions sortantes (taille de la liste) + * 02 03 Drapeaux (bit de poids faible: si l’état est final) + * 04 07 Vide * - * Le transducteur fini est représenté par une liste de transitions. */ + * Les transitions d’une même liste sont ordonnées du plus petit au plus grand. + * Si le bit le poids faible d’un symbole est 0, le décaler d’une position vers + * la droite donnera un indice dans la liste de symboles; s’il est 1, il s’agit + * d’un symbole spécial. Les symboles spéciaux sont les suivants. + * + * AUTRE: 0 + * EPSILON: 1 + * IDENTITÉ: 2 + * + * Une transition de la liste de transitions occupe aussi 8 octets. + * + * 00 01 Symbole d’entrée + * 02 03 Symbole de sortie + * 04 07 Identifiant d’état + */ /* Écrire une représentation .tfd du transducteur dans le fichier f. * Renvoie 0, ou -1 en cas d’erreur. */