Folco (./24) :
Et sinon, merci pour strncmp, ceci dit, ça ne m'empêchera pas de vérifier qu'après un symbole, il n'y a pas d'autres caractères (donc je devrais trouver toujours ';', ',', '|', EOL, EOF, 0x20, 0x09, ou alors vérifier qu'il n'y a pas de chiffre/lettre/point/underscore. Et ça oblige à calculer la longueur de la chaine qui me sert de référence pour la comparaison. J'ai implémenté une comparaison "on-the-fly", ça me semble être le plus rapide.
size_t l=strlen(keyword);
if (!strncmp(source,keyword,l)&&(!keyword[l]||strchr(";,|\n \t",keyword[l]))
...very (./30) :
ça revient exactement à faire à l'arrache si tu le fais lors de la même passe
Zephyr (./8) :
Bon, puisque le sujet Lex/Flex et Yacc/Bison est incontournable, autant ajouter un petit mot dessus : il s'agit de programmes avec lesquels tu vas respectivement pouvoir générer un lexeur et un parseur en indiquant d'un coté les "mots" valides de ton langage (sous la forme d'expressions régulières par exemple) et d'un autre la grammaire avec un formalisme proche de celui du ./6.
Avis perso : ça permet d'obtenir très vite un lexeur/parseur et donc ça peut être utile pour des petits programmes que tu veux réaliser rapidement, mais ça génère un code absolument immonde (aussi bien point de vue lisibilité qu'optimisation). Pour un "vrai" projet, et à fortiori si tu le fais en partie pour le plaisir d'apprendre, mon seul conseil serait de ne surtout jamais toucher à ces outils ^^
Zephyr (./8) :
Bon, puisque le sujet Lex/Flex et Yacc/Bison est incontournable, autant ajouter un petit mot dessus : il s'agit de programmes avec lesquels tu vas respectivement pouvoir générer un lexeur et un parseur en indiquant d'un coté les "mots" valides de ton langage (sous la forme d'expressions régulières par exemple) et d'un autre la grammaire avec un formalisme proche de celui du ./6.
Avis perso : ça permet d'obtenir très vite un lexeur/parseur et donc ça peut être utile pour des petits programmes que tu veux réaliser rapidement, mais ça génère un code absolument immonde (aussi bien point de vue lisibilité qu'optimisation). Pour un "vrai" projet, et à fortiori si tu le fais en partie pour le plaisir d'apprendre, mon seul conseil serait de ne surtout jamais toucher à ces outils ^^

Zephyr (./35) :
Bah c'est super et c'est ton droit le plus strict. Ceci dit ça ne contredit pas vraiment mon post, à moins que tu considères ETP comme un gros projet (à ne pas voir comme une critique, mais pour moi ça ressemble plus à un petit projet perso qu'autre chose).

Tu as perdu ton temps sur le parseur écrit à la main alors que tu aurais pu l'utiliser pour le reste du code.
(ce qui plait a pas mal de developers et ce qui plait pas aux QA/Sec)
Redimensionner un handle se fait toujours de la même manière, mes loaders se ressemblent tous etc... Donc en effet, il y a des ressemblances, mais c'est bien évidemment au niveau du concept d'un soft que ça fait que ça va changer.
)
) sera encore quelque chose de complètement nouveau niveau programmation.

|================================================================== | SkipSpaces |================================================================== | Advance reading pointer to the first char which is not a space or a tab | | input a3 current position in the source | output Z-flag unset if a char is found, set if EOL/EOF | a3 is updated | destroy d1.b |================================================================== SkipSpaces: move.b (%a3)+,%d1 |read and test current char, update pointer beq.s SkipSpacesEnd cmpi.b #0x20,%d1 |space ? beq.s SkipSpaces cmpi.b #0x09,%d1 |tab ? beq.s SkipSpaces cmpi.b #0x0d,%d1 |EOL ? SkipSpacesEnd: subq.l #1,%a3 |don't modify Z-Flag rts

...
), mais dans un programme utilisateur, c'est quand-même limite.
(Surtout que la taille de ton assembleur est probablement nettement supérieure à celle du code de démarrage de TIGCCLIB et que ta fonction risque d'être utilisée à beaucoup d'endroits qui ne sont pas forcément proches de ton commentaire sur la convention d'appel bizarre de cette fonction.)
|================================================================== | SkipComment |================================================================== | Advance reading pointer to the beginning of the next line | Never return, jump to EndOfSource in case of EOF, or ReadLine in case of EOL | | input a3 current position in the source | output a3 point to the first char of the next line | d4 updated | d5.b becomes invalid | destroy nothing |================================================================== SkipComment: addq.l #1,%a3 |skip '|' SkipCommentLoop: move.b (%a3)+,%d5 |read next char beq EndOfSource |EOF => post treatment cmpi.b #0x0d,%d5 |EOL ? bne.s SkipCommentLoop |no, loop until it's found addq.w #1,%d4 |else update line counter bra ReadLine |and begin a new line

