Esempio n. 1
0
// 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;
}
Esempio n. 2
0
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;
}