• [^] # Re: YY_INPUT

    Posté par . En réponse au message Parser une chaine de caractère en C avec Flex/Bison. Évalué à 1.

    La fonction my_yyinput ressemblerait à (je n'ai pas testé le code) :



    extern char* g_str;
    extern size_t g_str_size; /* taille de g_str */
    extern int g_str_read; /* nombre de caractère déjà envoyés à lex, initializé au départ à 0 */

    int my_yyinput(char* buf, int max_size)
    {
    /* on calcule le nombre de caractères à copier dans buf,
    * soit on a assez de caractères pour remplir, buf, soit on prend le reste de la chaine
    */
    int num = min(max_size, g_str_size-g_str_read);


    /* on copie notre chaine dans buf */
    if (num > 0)
    {
    memcpy(buf, g_str+g_str_read, num);
    g_str_read += num;
    }
    return num;
    }


    La macro YY_INPUT est appelée par flex pour reremplir le buffer interne sur lequel il travail. Ce qui permet d'optimiser la lecture en ne lisant pas caractère par caractère comme c'était le cas de lex d'AT&T. Donc ta fonction my_yyinput va être appelée à chaque fois que le buffer interne de flex est vide et tu lui donne la suite de ta chaîne.

    Étienne