Pregunta

Estoy escribiendo un jFlex lexer para Lua, y tengo problemas para diseñar una expresión regular que coincida con una parte particular de la especificación del lenguaje:

  

Las cadenas literales también se pueden definir utilizando un formato largo encerrado entre corchetes largos. Definimos un corchete largo de apertura de nivel n como un corchete de apertura seguido de n signos iguales seguidos de otro corchete de apertura. Entonces, un paréntesis largo de apertura del nivel 0 se escribe como [[, un corchete largo de apertura del nivel 1 se escribe como [= [, y así sucesivamente. Un corchete largo de cierre se define de manera similar; por ejemplo, un corchete largo de cierre del nivel 4 se escribe como] ====]. Una cadena larga comienza con un corchete largo de apertura de cualquier nivel y termina en el primer corchete largo de cierre del mismo nivel. Los literales en esta forma entre corchetes pueden ejecutarse por varias líneas, no interpretar ninguna secuencia de escape e ignorar los corchetes largos de cualquier otro nivel. Pueden contener cualquier cosa, excepto un corchete de cierre del nivel adecuado.

En pocas palabras, estoy tratando de diseñar una expresión regular que coincida con un corchete largo de apertura, el contenido de la cadena en el medio y el corchete largo de cierre. Una coincidencia solo debe ocurrir cuando el corchete largo de apertura y el corchete largo de cierre tienen el mismo número de signos iguales, que pueden ser cero o más.

¿Fue útil?

Solución

\[(=*)\[.*?\]\1\]

el \ 1 captura el primer ().

Otros consejos

Bueno, me temo que tokenizar con expresiones regulares no es lo suficientemente bueno para esta tarea. Las expresiones regulares simplemente no son lo suficientemente potentes.

No hay forma de comparar el número de marcas '=' usando expresiones regulares simples en jFlex. Perl tendría un truco para eso (\ 1 como se sugirió anteriormente), pero no estamos hablando de programar Perl, sino jFlex lexer.

La solución es ir con \ [= * \ [para el token de corchete izquierdo, \] = * \] para el token de corchete derecho, y luego en la capa de arriba (un analizador) comparar si coinciden en longitud.

De todos modos, puede mirar read_long_string () en el código fuente lua en llex.c y ver cómo lo hicieron sin usar expresiones regulares en absoluto.

\[(=*)\[.*?\]\1\]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top