IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Générateurs de compilateur Discussion :

Buffer de caracteres dans un fichier flex (analyse lexicale)


Sujet :

Générateurs de compilateur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut Buffer de caracteres dans un fichier flex (analyse lexicale)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    %{
    /* 
     * Plein de #include et #define ... que je ne copie pas
     */
    char string_buf[MAX_STR_CONST]; /* to assemble string constants */
    char *string_buf_ptr=&(string_buf[0]);
     
     
    /* ERROR STRINGS */
    const char EOFINCOMMENT[] = "EOF in comment";
    const char STRTOOLONG[] = "Const strings max size is 1024";
    const char EOFINSTR[] = "EOF in string";
    const char COMMENTOUT[] = "'*)' out of comment";
    const char NLINSTR[] = "NLINSTR";
     
    /* Gestion des erreurs*/
     
    void report_error(const char* Error_String)
    {
            cool_yylval.error_msg = (char *) malloc(sizeof(char) * (strlen(Error_String)+1));
            strcpy(cool_yylval.error_msg,Error_String);
    }
     
    /* Fonctions de gestion du buffer */
     
    void init_string_buf()
    {
            *string_buf_ptr = 'a';
            string_buf_ptr = &(string_buf[0]);
            string_buf[MAX_STR_CONST-1]='\0';
    }
     
    int append_string_buf(const char c)
    {
            if (*string_buf_ptr) { *string_buf_ptr=c; string_buf_ptr++; return 1; }
            else { return 0;}
    }
     
    %}
     
    ESCCHAR         [ntbf]
    NL                     \n
     
    %x STRMODE STROVERFLOW
    %%
     
    /* Je passe une grande partie du plat de spaghetti... */
     
    /*
      * Entering STRMODE
      */
     
    \" { init_string_buf(); BEGIN(STRMODE);}
     
    /* Gestion des chaines de caracteres */
    <STRMODE>\\{NOESCCHAR} { if(append_string_buf(yytext[1])!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW); return (ERROR);}}
     
    <STRMODE>\\n {  if(append_string_buf(10)!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW); return (ERROR);} }
     
    <STRMODE>\\t {  if(append_string_buf(9)!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW); return (ERROR);} }
     
    <STRMODE>\\b {  if(append_string_buf(8)!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW); }return (ERROR); }
     
    <STRMODE>\\f {  if(append_string_buf(12)!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW); return (ERROR);} }
     
    <STRMODE>\\{NL} {  curr_lineno++; if(append_string_buf(10)!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW);  return (ERROR);} }
     
     
     
    <STRMODE,STROVERFLOW>\"|\n {    *string_buf_ptr = '\0' ;
                    cool_yylval.symbol = stringtable.add_string(string_buf);
                    BEGIN(INITIAL); return STR_CONST; }
    <STRMODE><<EOF>> { report_error(EOFINSTR); return (ERROR);}
    <STRMODE>{NL} { report_error(NLINSTR); }
    <STRMODE>.  {  if(append_string_buf(yytext[0])!=1) { report_error(STRTOOLONG) ; BEGIN(STROVERFLOW); return (ERROR);}}
     
    <STROVERFLOW>[^\"{NL}] {}
    Je compile et teste sur les lignes 5 et 6 ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "str";
    "str \h \k \m \" ";
    Et j obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #5 ERROR "Const strings max size is 1024"
    #5 STR_CONST "s"
    #5 ';'
    #6 ERROR "Const strings max size is 1024"
    #6 STR_CONST "st"
    #6 STR_CONST ";"
    Bref, ca ne marche pas tout a fait comme attendu
    Si quelqu un a une idée, je suis preneur.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Je me demande si tu ne dépasses pas la taille de la pile. Allouer un tableau en local supérieur à la taille de la pile génère normalement un segdefault il me semble.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut
    Nonon, je ne dépassais pas la taille de la pile, les messages d'erreurs que tu vois sont ceux engendrés par le lexer que j ai fabriqué... et quelques uns de ces messages d'erreurs étaient bien voulus
    J ai fini par trouver une solution en arrêtant de me poser quelques questions sur la métaphysique des buffers... (voir ici)
    Bref le problème est résolu et me donne un lexer qui semble t il est parfaitement fonctionnel.
    Merci en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  2. Réponses: 10
    Dernier message: 22/05/2006, 11h45
  3. Ecriture par caractere dans un fichier.
    Par SaianSupa dans le forum C
    Réponses: 5
    Dernier message: 29/11/2005, 15h31
  4. [langage] recuperer 8 caracteres dans un fichier
    Par ifan dans le forum Langage
    Réponses: 12
    Dernier message: 24/05/2005, 17h01
  5. remplacer un caractere dans un fichier
    Par ickis dans le forum C
    Réponses: 11
    Dernier message: 13/10/2003, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo