trafi

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

commit f8affa7cbb007a8d8edfb2d57c80bf058bd43fe4
parent 668018f8f0df88242b59e796e74f10216f16575a
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Sun, 15 Feb 2026 20:38:59 -0500

Abadonner le traitement différentiel des symboles

Les symboles d’un caractères sont traités comme les autres.

Diffstat:
Mtfm.c | 41++++++++++++-----------------------------
Mtfm.h | 21++++++++-------------
2 fichiers modifiés, 20 insertions(+), 42 suppressions(-)

diff --git a/tfm.c b/tfm.c @@ -109,14 +109,6 @@ tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr, ssize_t *id) if (lngr > 0xFF) return -1; - /* Si la taille du symbole est 1 et qu’il n’est pas le caractère NUL, il - * est son propre identifiant. */ - if (lngr == 1 && *symb != '\0') { - *id = *(unsigned char *)symb; - assert(*id > 0); - return 0; - } - if ((pos = tfm_symb_chercher(tfm->symbs, symb, lngr)) >= 0) goto fin; @@ -129,7 +121,7 @@ tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr, ssize_t *id) fin: TFM_COHERENT(tfm); - *id = -pos; + *id = pos; return 0; } @@ -146,33 +138,25 @@ tfm_symb_obt(struct tfm *tfm, ssize_t id, char *symb, size_t max) ctn = tampinf_ctn(tfm->symbs); /* Sybmoles spéciaux. */ - switch (id) { - case TFM_SYMB_EPSILON: - if (max < 3) - return -1; - memcpy(symb, "@0@", 3); - return 3; - } - assert(id <= 0xFF); - - /* Les autres identifiants strictement positifs sont leur propre - * symbole. */ - if (id > 0) { - /* On sait déjà que le tampon symb a une longueur supérieure à - * zéro. */ - *symb = id; - return 1; + if (id < 0) { + switch (id) { + case TFM_SYMB_EPSILON: + if (max < 3) + return -1; + memcpy(symb, "@0@", 3); + return 3; + } } - assert(tampinf_dedans(tfm->symbs, -id)); - lngr = *(unsigned char *)(ctn + -id); + assert(tampinf_dedans(tfm->symbs, id)); + lngr = *(unsigned char *)(ctn + id); /* Le symbole doit rentrer dans le tampon. */ if (lngr > max) return -1; /* Copier le symbole. */ - for (i = 0, ctn += -id + 1; i < lngr; i++) + for (i = 0, ctn += id + 1; i < lngr; i++) symb[i] = ctn[i]; return lngr; @@ -218,7 +202,6 @@ tfm_symb_chercher(struct tampinf *ti, char *symb, size_t lngr) unsigned n; assert(symb); - assert(lngr > 1); ctn = tampinf_ctn(ti); diff --git a/tfm.h b/tfm.h @@ -8,16 +8,15 @@ /* L’accronyme « tfm » veut dire « transducteur fini en mémoire ». */ /* Liste de symboles spéciaux. */ -#define TFM_SYMB_EPSILON 256 -#define TFM_SYMB_ETOILE 267 +#define TFM_SYMB_EPSILON -1 +#define TFM_SYMB_ETOILE -2 /* Une structure tfm représente un transducteur fini et renferme trois tampons * infinis pour y stocker les états, les transitions entre les états et les * symboles de plus d’un octet. Les symboles sont stocké à 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. Tous les symboles stockés - * de cette manière font au moins 2 octets, sauf le caractère NUL. */ + * est limité à une longueur maximale de 255 octets. */ #define TFM_TLL_SYMB_MAX 255 /* Taille maximale d’un symbole. */ @@ -29,7 +28,8 @@ struct tfm { /* Un état contient l’identifiant d’une liste chaînée de ses transitions * sortantes. Il donne aussi le nombre de transitions que cette liste - * contient. Il peut enfin est marqué comme final. */ + * contient. Il peut enfin est marqué comme final. trans et ntrans sont des + * indices dans le tampon tfm.trans. */ struct etat { size_t trans; /* Liste chaînée de transitions. */ @@ -39,14 +39,9 @@ struct etat { /* Les transitions qui partagent un même état source forment une liste chaînée, * dont la taille est donnée dans cet état source. Les transitions ne sont pas - * nécessairement ordonnées. Si un symbole est long d’un octet, il est placé - * directement dans se ou dans ss; s’il est plus long, il est stocké dans le - * tampon symbs d’un tfm et c’est la négation de l’identifiant de ce symbole qui - * est placé dans se ou dans ss. C’est le signe qui distingue les deux - * méthodes. Seul le caractère NUL fait exception à cette règle, car dans les - * systèmes qui utilisent le complément à deux, 0 et -0 ont la même - * représentation. Dans ce programme, le caractère NUL est traité comme un - * caractère de plus d’un octet. */ + * nécessairement ordonnées. se et ss sont des indices dans le tampon tfm.etats. + * ed est un indice dans le tampon tfm.etats. prch est un indice dans le tampon + * tfm.trans. */ struct trans { ssize_t se; /* Symbole d’entrée. */