SEMESTRE: 6.
Manejo del fichero de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y
gestionar posibles errores de lectura.
Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea (caracteres no
válidos para formar un token).
Inclusión de ficheros: # include ...
La expansión de macros y funciones inline: # define ...
Contabilizar el número de líneas y columnas para emitir mensajes de error.
Reconocimiento y ejecución de las directivas de compilación (por ejemplo, para depurar
u optimizar el código fuente).
Patrón: es una regla que genera la secuencia de caracteres que puede representar a un
determinado componente léxico (una expresión regular). Lexema: cadena de caracteres que
concuerda con un patrón que describe un componente léxico. Un componente léxico puede
tener uno o infinitos lexemas. Por ejemplo: palabras reservadas tienen un ´único lexema. Los
números y los identificadores tienen infinitos lexemas.
Los componentes léxicos se suelen definir como un tipo enumerado. Se codifican como
enteros. También se suele almacenar la cadena de caracteres que se acaba de reconocer (el
lexema), que se usara posteriormente para el análisis semántico.
typedef struct {
TokenType token;
TokenRecord getToken(void);
<TKN CORCIERRE,]>
INSERTAR.
CONSULTAR.
MODIFICAR (añadir atributos nuevos).
El CUANDO y el CÓMO se usan estas operaciones dependen del tipo de lenguaje:
Implícitas:
* CONSULTAR si no está ya incluida.
* INSERTAR, en caso contrario.
* Lenguajes con estructura de BLOQUE: CREAR SUBTABLAS
Operadores Lógicos:
&& And
|| Or
! Not
OPERADORES DE ASIGNACIÓN
= Asignación.
*= Asignación de producto.
/= Asignación de cociente.
%= Asignación de residuo.
+= Asignación de suma.
-= Asignación de diferencia.
<<= Asignación de corrimiento a la izquierda.
>>= Asignación de corrimiento a la derecha.
&= Asignación de And de bits.
^= Asignación de Xor de bits.
|= Asignación de Or de bits.
Si en el momento de detectar el error ya hemos pasado por algún estado final ejecutamos
la acción correspondiente al ´ultimo estado final visitado con el lexema formado hasta
que salimos de ´el; el resto de los caracteres le ‘idos se devuelven al flujo de entrada y se
vuelve al estado inicial;
Si no hemos pasado por ningún estado final, advertimos que el carácter encontrado no se
esperaba, lo eliminamos y proseguimos con el análisis.
LEX
Lex es una herramienta de los sistemas UNIX/Linux que nos va a permitir generar código C
que luego podremos compilar y enlazar con nuestro programa. La principal característica
de Lex es que nos va a permitir asociar acciones descritas en C, a la localización de las
Expresiones Regulares que le hayamos definido. Para ello Lex se apoya en una plantilla que
recibe como parámetro, y que deberemos diseñar con cuidado.
Internamente Lex va a actuar como un autómata que localizará las expresiones regulares que
le describamos, y una vez reconocida la cadena representada por dicha expresión regular,
ejecutará el código asociado a esa regla.
Lex va a permitirnos definir nuestras propias acciones en un lenguaje mucho más común: C.
La plantilla en la que Lex se va a apoyar para generar el código C, y donde nosotros
deberemos describir toda la funcionalidad requerida, va a ser un fichero de texto plano con
una estructura bien definida, donde iremos describiendo las expresiones regulares y las
acciones asociadas a ella. Se compone de tres secciones con estructuras distintas y claramente
delimitadas por una línea en la que lo único que aparece es el carácter doble %. Las secciones
de ‘Declaraciones’ y la de ‘Procedimientos de Usuario’ son opcionales, mientras que la de
‘Reglas’ es obligatoria (aunque se encuentre vacía).
FLEX
El fichero Flex contiene las tablas de autómata generado y la función int flex(void) que simula
el analizador especificado y sirve de interfaz con el código de usuario (flex () deberá de ser
llamada en algún punto del código del usuario)
En cada llamada, flex () irá tomando caracteres de la entrada hasta que machee una de las
expresiones regulares de la especificación. Entonces, se almacenará el texto que ha macheado
la expresión. reg. en la variable text y se ejecutarán las acciones asociadas al patrón.
Las acciones podrán ser simplemente el procesamiento del texto macheado y enviarlo de
nuevo a la salida.