Mille fois merci !
C'est très clair, mais je ne sais pas, vu la simplicité de l'assembleur 68000, si j'ai intérêt à décrire toute une grammaire formellement pour ensuite faire marcher une moulinette. Surtout que mes instructions 68k à proprement parler sont enregistrées sous cette forme-là :
|movem
INSTRUCTION 0x4880,TWO_OP+OTH_OP+OP_REG_MASK,SIZE_WL+DL_MASK3,AM_WRT+AM_AN_IND+AM_AN_DEC+AM_X_AN+AM_X_AN_XN+AM_XW+AM_XL |+ AM_SRC ?
INSTRUCTION 0x4c80,TWO_OP+OP_REG_MASK2,SIZE_WL+DL_MASK3,AM_WRT+AM_AN_IND+AM_AN_INC+AM_X_AN+AM_X_AN_XN+AM_XW+AM_XL+AM_PCREL
Donc quand je tombe sur une instruction, en plus du masque, je sais ce qu'elle a le droit de trouver après ou pas, je compte me servir de cette table. j'aurai juste à savoir lire les 14 adressages du 68k (ça me semble pas encore énorme). Après, pour les commandes xdef/include/incbin/etc..., c'est vraiment du cas par cas.
Zephyr (./6) :
Ce lexeur pourra être ensuite appelé depuis tes fonctions de parsing pour les alléger au maximum (pas la peine d'aller se taper de la lecture de chaine et de la comparaison de caractères en plein milieu d'une fonction supposée analyser la construction grammaticale d'un programme
Je me suis trouvé avec une merde : impossible d'utiliser les fonctions de string.h ! En effet, dans le source, rien ne se termine par #0, c'est EOF... On peut donc avoir "|" (commentaires), ";" (équivalent à \n, mais on reste sur la même ligne), un espace, une tabulation, une virgule dans certains cas (xdef), EOL, etc... Donc une solution consiste à vérifier la présence de tous ces éléments pour détecter la fin de la chaine, un peu partout dans le code, à chaque fois qu'on doit vérifier une chaine (gros bordel bien chiant à écrire, sûrement très très drôle à débugguer). L'autre solution consiste à recopier dans un buffer (de quelle taille ?) et de faire terminer par un #0, puis d'utiliser des fonctions classiques de comparaisons ou de recherche. Bref, c'est la joie !!!

Je me pose toutes ces question, parce qu'hier, j'ai codé le comportement des labels (vérification de la validité, création d'un checksum et ajout dans la table kivabien) et des xdef (checksum et ajout dans la table.
Donc dans les deux cas, je m'occupe d'un label. Ca a l'air d'être la même chose, un label et un label. Mais non, rien à voir ! Dans un cas, je m'arrête aux ":", et si je trouve un caractère non alphanumérique (ou ".", valide dans un label), l'assembleur gueule et s'arrête. C'est très simple.
Dans l'autre, faut savoir où s'arrête le label. On a le choix entre EOL, EOF, ";", "|", ",", <espace>, <tab>. C'est déjà plus lourd à vérifier ! Qui plus est, si on a des espaces, puis des tabs, et enfin une virgule, on repart sur un nouveau label ! Jouissif. J'ai pas fini de me prendre le choux pour trouver une description générique et efficace d'un source valide.
