Publié par Freem le 24/12/2006
Code source est a améliorer pour le parser. Le constructeur s'occupe des commandes. Je sais que ce n'est pas recommandé, mais je l'ai fait pour démarrer. Il faudra juste travailler la classe après.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
class CChaine { public: void Enchainer(int); unsigned int Lire(int); }; //a travailler, c'etait juste pour l'exemple. #include <string.h> #define NBINST 10 #define MAXCAR 30 typedef struct { char chaine[MAXCAR]; void *verSyntaxe; void *traducteur; }Commande; class indexMots : public CChaine { public: unsigned long i; }; class Parser { public: char *source; unsigned long lenSource; protected: private: Commande liste[NBINST]; unsigned long nbLignes; unsigned short nbVar, nbFonc; indexMots index; public: void main(void); Parser(void); ~Parser(void); protected: private: }; void Parser::main(void) { char *mot=0; unsigned long cpt, ligne, debutMot=0, tmp; index.Enchainer(0); for(cpt=0;cpt<lenSource;cpt++) { while(source[cpt]!='\\"') {cpt++;} if(!strcpy(source+cpt,"REM ") || source[cpt]!='\\'') { while(source[cpt]!='\\n') {cpt++;} } if(source[cpt]=='\\n') { nbLignes++; index.Enchainer(cpt); } } //compte le nombres de lignes de code for(ligne=0;ligne<nbLignes;ligne++) { cpt=index.Lire(ligne); do { debutMot=cpt; do{cpt++;} while(source[cpt]!=' ' && source[cpt]!='\\\\'); if(mot) delete mot; mot=new char[cpt-debutMot]; strncpy(mot,source+debutMot,cpt-debutMot); /*lit un mot (qu'il faudra probablement débarrasser des blancs non significatifs, s'il y en a...)*/ for(tmp=0;tmp<(unsigned)(NBINST+nbVar+nbFonc);tmp++) { /*il va falloir chainer les instructions, fonctions et variables dans la meme liste*/ if(!strcmp(mot,liste[tmp].chaine)) { (liste[tmp].verSyntaxe)(); //execute la fonction qui vérifie la syntaxe et le nombre d'arguments break; } } }while(cpt<index.Lire(ligne+1)); } }