Expression régulière d’un littéral de chaîne dans flex / lex

J’expérimente pour apprendre le flex et je voudrais faire correspondre les littéraux de chaîne. Mon code ressemble actuellement à:

"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches ssortingng-literal*/;} 

Je suis aux sockets avec des variations depuis environ une heure et je ne peux pas le faire fonctionner comme il se doit. J’espère essentiellement faire correspondre un littéral de chaîne qui ne peut pas contenir de nouvelle ligne (sauf s’il est échappé) et prend en charge les caractères échappés.

Je suis probablement en train d’écrire une mauvaise expression régulière ou une expression incompatible avec flex. S’il vous plaît donnez votre avis!

    Vous trouverez ces liens utiles

    • Grammaire ANSI, spécification Lex

    • ANSI C Yacc grammaire

    Une chaîne se compose d’un guillemet

     " 

    suivi par zéro ou plus de l’un ou l’autre échappé quelque chose

     \\. 

    ou un caractère non cité

     [^"\\] 

    et enfin un devis de fin

     " 

    Mettez tout cela ensemble et vous avez

     \"(\\.|[^"\\])*\" 

    Les guillemets de délimitation sont échappés car ce sont des méta-caractères Flex.

    Pour une seule ligne … vous pouvez utiliser ceci:

     \"([^\\\"]|\\.)*\" {/*matches ssortingng-literal on a single line*/;} 

    Que diriez-vous d’utiliser un état de démarrage …

     int enter_dblquotes = 0;
    
     % x DBLQUOTES
     %%
    
     \ "{BEGIN (DBLQUOTES); enter_dblquotes ++;}
    
      * " 
     { 
        si (enter_dblquotes) {
            handle_this_dblquotes (yytext); 
            COMMENCER (INITIAL);  / * revenir à la normale * /
            enter_dblquotes--; 
        } 
     }
              ... plus de règles suivent ...
    

    Il était similaire à cet effet (flex utilise %s ou %x pour indiquer quel état serait attendu. Lorsque l’entrée Flex détecte un devis, il passe à un autre état, puis continue jusqu’à ce qu’il atteigne un autre devis, dans lequel il revient à l’état normal.

    Une réponse qui arrive en retard mais qui peut être utile pour le prochain qui en aura besoin:

     \"(([^\"]|\\\")*[^\\])?\"