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:
| M | tfm.c | | | 41 | ++++++++++++----------------------------- |
| M | tfm.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. */