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).
|================================================================== | 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
|================================================================== | 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