Expresión regular para una cadena literal en flex/lex
regex string-literals (6)
¿Qué hay de usar un estado de inicio ...
int enter_dblquotes = 0; %x DBLQUOTES %% /" { BEGIN(DBLQUOTES); enter_dblquotes++; } <DBLQUOTES>*/" { if (enter_dblquotes){ handle_this_dblquotes(yytext); BEGIN(INITIAL); /* revert back to normal */ enter_dblquotes--; } } ...more rules follow...
Fue similar a ese efecto (flex usa %s
o %x
para indicar qué estado se esperaría. Cuando la entrada de flexión detecta una cotización, cambia a otro estado, luego continúa hasta que alcanza otra cotización, en la que vuelve a aparecer al estado normal.
Estoy experimentando para aprender flex y me gustaría hacer coincidir literales de cadena. Mi código actualmente se ve como:
"/""([^/n/"//]*(//[./n])*)*"/"" {/*matches string-literal*/;}
He estado luchando con las variaciones durante una hora más o menos y no puedo hacerlo funcionar como debería. Básicamente espero hacer coincidir una cadena literal que no pueda contener una nueva línea (a menos que se escape) y que admita caracteres escapados.
Probablemente solo estoy escribiendo una expresión regular pobre o incompatible con flex. ¡Por favor avise!
Encontrarás estos enlaces útiles
Para una sola línea ... puedes usar esto:
/"([^///"]|//.)*/" {/*matches string-literal on a single line*/;}
Una cadena consiste en una comilla
"
seguido de cero o más de cualquier cosa que haya escapado
//.
o un personaje sin comillas
[^"//]
y finalmente una cita de terminación
"
Ponlo todo junto, y tienes
/"(//.|[^"//])*/"
Las comillas de delimitación se escapan porque son metacaracteres Flex.
Una respuesta que llega tarde pero que puede ser útil para la próxima persona que la necesite:
/"(([^/"]|///")*[^//])?/"