c regex lex string-literals flex-lexer

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!



Esto es lo que usamos en Zolang para Zolang de una sola línea con plantillas incrustadas ${...}

/"(/$/{.*/}|//.|[^/"//])*/"


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:

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