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:
\"(([^\"]|\\\")*[^\\])?\"