El fichero de entrada de
flex está compuesto de tres secciones, separadas por una línea donde aparece únicamente un `
reglas
código de usuario
La sección de **definiciones** contiene declaraciones de definiciones de **nombres** sencillas para simplificar la especificación del escáner, y declaraciones de **condiciones** de arranque, que se explicarán en una sección posterior. Las definiciones de nombre tienen la forma:
nombre definición
El "nombre" es una palabra que comienza con una letra o un subrayado (`_') seguido por cero o más letras, dígitos, `_', o `-' (guión). La definición se considera que comienza en el primer caracter que no sea un espacio en blanco siguiendo al nombre y continuando hasta el final de la línea. Posteriormente se puede hacer referencia a la definición utilizando "{nombre}", que se expandirá a "(definición)". Por ejemplo,
DIGITO [0-9]
ID [a-z][a-z0-9]*
define "DIGITO" como una expresión regular que empareja un dígito sencillo, e "ID" como una expresión regular que empareja una letra seguida por cero o más letras o dígitos. Una referencia posterior a
{DIGITO}+"."{DIGITO}*
es idéntica a
([0-9])+"."([0-9])*
y empareja uno o más dígitos seguido por un `.' seguido por cero o más dígitos.
La sección de reglas en la entrada de ##flex## contiene una serie de reglas de la forma:
patrón acción
donde el patrón debe estar sin sangrar y la acción debe comenzar en la misma línea.
See section [[http://es.tldp.org/Manuales-LuCAS/FLEX/flex-es-2.5.html#SEC7 Acciones]], para una descripción más amplia sobre patrones y acciones.
Finalmente, la sección de código de usuario simplemente se copia a ##`lex.yy.c'## literalmente. Esta sección se utiliza para rutinas de complemento que llaman al escáner o son llamadas por este. La presencia de esta sección es opcional; Si se omite, el segundo `
' en el fichero de entrada se podría omitir también.
En las secciones de definiciones y reglas, cualquier texto
sangrado o encerrado entre `%{' y `%}' se copia íntegramente a la salida (sin los %{}'s). Los %{}'s deben aparecer sin sangrar en líneas ocupadas únicamente por estos.
En la sección de reglas, cualquier texto o %{} sangrado que aparezca antes de la primera regla podría utilizarse para declarar variables que son locales a la rutina de análisis y (después de las declaraciones) al código que debe ejecutarse siempre que se entra a la rutina de análisis. Cualquier otro texto sangrado o %{} en la sección de reglas sigue copiándose a la salida, pero su significado no está bien definido y bien podría causar errores en tiempo de compilación (esta propiedad se presenta para conformidad con
POSIX; para otras características similares) see section
Incompatibilidades con ##lex## y POSIX∞)
En la sección de definiciones (pero no en la sección de reglas), un comentario sin sangría (es decir, una línea comenzando con "/*") también se copia literalmente a la salida hasta el próximo "*/".