trafi

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

commit cb0d23c75e3188b976c701f19b00de348e71a98d
parent 8cf0e957550bdf5145869f7030ed3f9eca56b770
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date:   Sun, 15 Feb 2026 15:18:07 -0500

Traiter le caractère NUL comme un symble complexe

L’interprétation de l’identifiant de symbole 0 est fixée. L’identifiant dénote
désormais un symbole placé dans le tampon des symboles et le symbole NUL doit y
être placé.

Diffstat:
Mtfm.c | 6+++---
Mtfm.h | 7+++++--
2 fichiers modifiés, 8 insertions(+), 5 suppressions(-)

diff --git a/tfm.c b/tfm.c @@ -109,9 +109,9 @@ tfm_symb_id(struct tfm *tfm, char *symb, size_t lngr, ssize_t *id) if (lngr > 0xFF) return -1; - /* Si la taille est 1, l’identifiant du symbole est le symbole - * lui-même. */ - if (lngr == 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; diff --git a/tfm.h b/tfm.h @@ -17,7 +17,7 @@ * 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. */ + * de cette manière font au moins 2 octets, sauf le caractère NUL. */ #define TFM_TLL_SYMB_MAX 255 /* Taille maximale d’un symbole. */ @@ -43,7 +43,10 @@ struct etat { * 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. */ + * 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. */ struct trans { ssize_t se; /* Symbole d’entrée. */