trafi

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

commit 8055e62c92a91be5da513e22c24a41b74a9b45c5
parent ebf979c814c6c17fcbc50c985004393d8d07f800
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Fri, 10 Apr 2026 17:02:17 -0400

Mettre à jour la documentation du tfm

Diffstat:
Mtfm.h | 61++++++++++++++++++++++++++++---------------------------------
1 fichier modifié, 28 insertions(+), 33 suppressions(-)

diff --git a/tfm.h b/tfm.h @@ -8,16 +8,19 @@ /* L’accronyme « tfm » veut dire « transducteur fini en mémoire ». */ /* Liste de symboles spéciaux. */ -#define TFM_SYMB_EPSILON -1 -#define TFM_SYMB_IDENTITE -2 -#define TFM_SYMB_AUTRE -3 +#define TFM_SYMB_AUTRE ((0 << 1) | TFM_SSPECIAL) +#define TFM_SYMB_EPSILON ((1 << 1) | TFM_SSPECIAL) +#define TFM_SYMB_IDENTITE ((2 << 1) | TFM_SSPECIAL) + +#define TFM_SSPECIAL 0x00 /* Symbole spécial. */ +#define TFM_SNORMAL 0x01 /* Symbole normal. */ /* Une structure tfm représente un transducteur fini et renferme trois tampex * pour y stocker les états, les transitions entre les états et les symboles. * Les symboles sont stockés à la Pascal, c’est-à-dire que les caractères d’une - * chaîne sont précédés d’un octet qui en indique la taille. Un symbole peut - * donc contenir le caractère NUL, mais il est limité à une longueur maximale - * de 255 octets. */ + * chaîne sont précédés d’un octet non-signé qui en indique la taille. Un + * symbole peut donc contenir le caractère NUL, mais il est limité à une + * longueur maximale de 255 octets. */ #define TFM_TLL_SYMB_MAX 255 /* Taille maximale d’un symbole. */ @@ -29,12 +32,13 @@ struct tfm { }; /* Un état contient l’identifiant de sa première transition sortante, qui est - * en tête d’une liste chaînée rassemblant toutes ses transitions sortantes. Il - * donne aussi le nombre de transitions que cette liste contient. Il peut enfin - * être marqué comme final. trans est un indice dans le tampon tfm->trans. */ + * en tête d’une liste chaînée rassemblant toutes ses transitions sortantes. Si + * la liste est vide, trans prend la valeur de -1. Il donne aussi le nombre de + * transitions que cette liste contient. Il peut enfin être marqué comme final + * ou trié. trans est un indice dans le tampon tfm->trans. */ struct etat { - ssize_t trans; /* Liste chaînée de transitions. -1 marque la fin. */ + ssize_t trans; /* Liste chaînée de transitions. */ size_t ntrans; /* Nombre de transitions. */ bool existe; /* Si l’état existe. */ bool final; /* État final? */ @@ -42,18 +46,19 @@ struct etat { }; /* Les transitions qui partagent un même état source forment une liste chaînée - * et dont la taille est donnée par le champ ntrans de cet état source. Les - * transitions d’une liste ne suivent pas d’ordre particulier. S’ils sont - * positifs, se et ss sont des indices dans le tampon tfm->symbs; s’ils sont - * strictement négatifs, ils contiennent des symboles spéciaux. ed est un - * indice dans le tampon tfm->etats. prch est un indice dans le tampon - * tfm->trans. */ + * et dont la taille est donnée par le champ ntrans de cet état source. Elles + * contiennent un symbole d’entrée et un symbole de sortie. Si le bit de poids + * faible d’un symbole est 1, le décaler d’une position vers la droite donnera + * un indice dans tfm->trans; s’il est 0, il s’agit d’un symbole spécial. ed + * est un indice dans le tampon tfm->etats. prch est un indice dans le tampon + * tfm->trans. Une valeur de -1 indique qu’il n’y a pas de prochaine + * transition. */ struct trans { - ssize_t se; /* Symbole d’entrée. */ - ssize_t ss; /* Symbole de sortie. */ + size_t se; /* Symbole d’entrée. */ + size_t ss; /* Symbole de sortie. */ size_t ed; /* État destination. */ - ssize_t prch; /* Prochaine transition. -1 marque la fin. */ + ssize_t prch; /* Prochaine transition. */ }; /* Initialiser un tfm. @@ -67,13 +72,11 @@ void tfm_libr(struct tfm *tfm); /* Ajouter au transducteur tfm une transition de l’état es à l’état ed avec les * symboles d’entrée et de sortie se et ss. * Renvoie 0, ou -1 en cas d’erreur. */ - int tfm_ajt(struct tfm *tfm, size_t es, size_t ed, ssize_t se, ssize_t ss); /* Obtenir l’identifiant d’un symbole symb de longueur lngr dans le - * transducteur tfm. - * Si le symbole est inconnu du transducteur, il y est ajouté de manière - * transparente. + * transducteur tfm. Si le symbole est inconnu du transducteur, il y est ajouté + * de manière transparente. * Renvoie l’identifiant, ou -1 en cas d’erreur. * Prend pour acquis que lngr n’est pas plus grand que TFM_TLL_SYMB_MAX. */ ssize_t tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr); @@ -84,15 +87,6 @@ ssize_t tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr); * spéciaux. Renvoie la taille du symbole, ou -1 en cas d’erreur. */ ssize_t tfm_symb_obt(struct tfm *tfm, size_t id, char *symb, size_t max); -/* Parcourir les symboles du transducteurs tfm. - * Un symbole est placé dans le tampon symb, de taille max, à chaque appel. - * L’identifiant id est un pointeur vers l’identifiant du prochain symbole à - * lire. Il est normalement initialisé à 0 avant le parcours. Cette fonction - * n’exporte que les symboles non-spéciaux. - * Renvoie la taille du symbole, 0 s’il ne reste plus de symbole à lire, ou -1 - * en cas d’erreur. */ -ssize_t tfm_parc_symbs(struct tfm *tfm, size_t *id, char *symb, size_t max); - /* Marquer un état comme final. * Renvoie 0, ou -1 en cas d’erreur. */ int tfm_mfinal(struct tfm *tfm, size_t ietat); @@ -101,7 +95,8 @@ int tfm_mfinal(struct tfm *tfm, size_t ietat); * Renvoie un booléen, ou -1 en cas d’erreur. */ int tfm_tfinal(struct tfm *tfm, size_t ietat); -/* Trier les transitions de tous les états du transducteur tfm. */ +/* Trier du plus grand au plus petit les transitions de tous les états du + * transducteur tfm. */ void tfm_trier(struct tfm *tfm); #endif