// test si un mot est un label (une lettre puis des lettres ou des chiffres) int islabel(char* src) { if (!isletter(*src++)) return 0; while(*src) { if (!isletnum(*src++)) return 0; } return 1; }
int Parser::gettoken(int filter) { int c,d,f; restorechar(); do { // recherche le début du token // on sauvegarde la position dans le source lign0=lign; offligne0=offligne; offchar0=index; c=nextchar(); if (!c) { return -1; // fin du fichier, pas de nouveau token } } while(c<=32); token=&src[offchar0]; f=0; if (c=='\"') // token chaîne de caractères while(1) { c=nextchar(); if (!c) { term->printf(LOG_COMPILER,"uncomplete string reaches EOF\n"); return -1; } if ((c=='\"')&&(f==0)) { savechar(index); return 0; } if (c=='\\') { f=1-f; } else { f=0; } } if (isletnum(c)) // token nombre ou label { int onlynum=1; while(1) { if (!isnum(c)) { onlynum=0; } c=nextchar(); if (!c) { return 0; } if ((c=='.')&&(onlynum)) // nombre flottant { while(1) { c=nextchar(); if (!c) { return 0; } if (!isnum(c)) { againchar(); savechar(index); return 0; } } } if (!isletnum(c)) { againchar(); savechar(index); return 0; } } } d=nextchar(); if (!d) { return 0; // fin du fichier sur un caractère spécial } if ( ((c=='&')&&(d=='&')) ||((c=='|')&&(d=='|')) ||((c==':')&&(d==':')) ||((c=='^')&&(d=='^')) ||((c==';')&&(d==';')) ||((c=='-')&&(d=='>')) ||((c=='<')&&((d=='<')||(d=='/'))) ||((c=='>')&&(d=='>')) ||((c=='=')&&(d=='=')) ||((c=='/')&&((d=='*')||(d=='>'))) ||((c=='*')&&(d=='/')) ) { // caractère double reconnu } else if ((c=='/')&&(d=='/')) { do // cas du commentaire // { c=nextchar(); if (c==10) { return -2; } } while (c); return -1; // fin de fichier, pas de nouveau token } else if (((c=='!')||(c=='>')||(c=='<'))&&(d=='=')) { /* d=nextchar(); if (!d) return 0; // fin du fichier sur un caractère spécial composé if (d!='.') againchar(); */ } else { againchar(); } savechar(index); return 0; }