Expressão regular para um literal de string em flex / lex

Estou experimentando aprender flex e gostaria de combinar literais de string. Meu código atualmente se parece com:

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

Eu tenho lutado com variações por uma hora ou mais e não posso fazê-lo funcionar da maneira que deveria. Eu estou na verdade esperando para combinar uma string literal que não pode conter uma nova linha (a menos que seja escapado) e suporta caracteres de escape.

Eu provavelmente estou apenas escrevendo uma expressão regular pobre ou incompatível com flex. Por favor informar!

Você encontrará esses links úteis

  • Gramática ANSI C, especificação Lex

  • Gramática ANSI C Yacc

Uma string consiste em uma marca de aspas

 " 

seguido por zero ou mais de qualquer um escapou nada

 \\. 

ou um caractere sem aspas

 [^"\\] 

e finalmente uma citação final

 " 

Junte tudo, e você tem

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

As aspas delimitadoras são escapadas porque são metacaracteres do Flex.

Para uma única linha … você pode usar isto:

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

Que tal usar um estado inicial …

 int enter_dblquotes = 0;

 % x DBLQUOTES
 %%

 \ "{BEGIN (DBLQUOTES); enter_dblquotes ++;}

  * \ " 
 { 
    if (enter_dblquotes) {
        handle_this_dblquotes (yytext); 
        COMEÇAR (INICIAL);  / * volta ao normal * /
        enter_dblquotes--; 
    } 
 }
          ... mais regras seguem ...

Foi semelhante a esse efeito (flex usa %s ou %x para indicar qual estado seria esperado. Quando a input flexível detecta uma cotação, ela alterna para outro estado e continua lexing até atingir outra cotação, na qual ela reverte de volta para o estado normal.

Uma resposta que chega atrasada, mas que pode ser útil para a próxima pessoa que precisará dela:

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