Espressione regolare per una stringa letterale in flex / lex

Sto sperimentando per imparare il flex e vorrei abbinare i letterali delle stringhe. Il mio codice attualmente sembra:

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

Ho lottato con variazioni per un’ora o giù di lì e non riesco a farlo funzionare come dovrebbe. Sto essenzialmente sperando di far corrispondere un letterale stringa che non può contenere una nuova riga (a meno che non sia sfuggito) e supporti caratteri di escape.

Probabilmente sto solo scrivendo una scarsa espressione regolare o una incompatibile con il flex. Si prega di avvisare!

Troverete questi collegamenti utili

  • Grammatica ANSI C, specifica Lex

  • Grammatica ANSI C Yacc

Una stringa consiste in un segno di citazione

 " 

seguito da zero o più di uno qualsiasi fuoriuscito

 \\. 

o un personaggio non quotato

 [^"\\] 

e infine una citazione che termina

 " 

Metti tutto insieme, e hai

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

Le virgolette delimitanti sono sfuggite perché sono meta-caratteri Flex.

Per una singola riga … puoi usare questo:

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

Che ne dici di usare uno stato di partenza …

 int enter_dblquotes = 0;

 % x DBLQUOTES
 %%

 \ "{INIZIA (DBLQUOTE); enter_dblquotes ++;}

  * \" 
 { 
    if (enter_dblquotes) {
        handle_this_dblquotes (yytext); 
        BEGIN (iniziale);  / * torna alla normalità * /
        enter_dblquotes--; 
    } 
 }
          ... altre regole seguono ...

Era simile a quell’effetto (flex usa %s se %x per indicare quale stato ci si aspetterebbe. Quando l’input flex rileva una citazione, passa a un altro stato, quindi continua lexing finché non raggiunge un’altra citazione, nella quale ritorna indietro allo stato normale.

Una risposta che arriva in ritardo ma che può essere utile per il prossimo che ne avrà bisogno:

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