Análisis léxico (Scanner) La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de caracteres y dividirlo en tokens. Función de un analizador léxico Su principal función consiste en leer la secuencia de caracteres del programa fuente, carácter a carácter, y elaborar como salida la secuencia de componentes léxicos que utiliza el analizador sintáctico. ¿Cómo lo hace? El analizador sintáctico emite la orden al analizador léxico para que agrupe los caracteres y forme unidades con significado propio llamados componentes léxicos (tokens). ¿Qué es un token? Los tokens son las palabras reservadas de un lenguaje, secuencia de caracteres que representa una unidad de información en el programa fuente. Ejemplo: if, else, while, int, etc. Los componentes léxicos Palabras reservadas: if, while, do, … Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas, … Operadores: =, >, <, >=, <=, +, *, … Símbolos especiales: ;, ( ), { }, … Constantes numéricas. literales que representan valores enteros y flotantes. Constantes de carácter: literales que representan cadenas de caracteres. Otras funciones Manejo de apertura y cierre de archivo, lectura de caracteres y gestión de posibles errores de apertura. Eliminar comentarios, espacios en blanco, tabuladores y saltos de línea. Contabilizar número de líneas y columnas para emitir mensajes de error. Ventajas Al separar el análisis léxico y análisis sintáctico es que facilita la transportabilidad del traductor si se decide realizar cambios posteriores, por ejemplo cambiar las etiquetas begin-end por llaves de apertura y cierre { }. Componentes léxicos, patrones y lexemas Componente léxico Es la secuencia lógica y coherente de caracteres relativo a una categoría: identificador, palabra reservada, literales (cadena/numérica), operador o carácter de puntuación, además de que un componente léxico puede tener uno o varios lexemas. Patrón Es una regla que genera la secuencia de caracteres que puede representar a un determinado componente léxico (expresión regular). ¿Qué es una expresion regular? Frecuentemente se les llaman patrones, ya que son expresiones que describen a un conjunto de cadenas. Lexema Es una cadena de caracteres que concuerda con un patrón que describe un componente léxico (valor de cadena). Ejemplo Ejemplo de una cadena de código: const pi = 3.1416; Nota En la practica los componentes léxicos suelen tener solo un atributo. Para efectos de diagnóstico, puede considerarse tanto el lexema para un identificador como el numero de línea en el que se encontró por primera vez. Esta información puede ser almacenada en la tabla de símbolos para el identificador. Creación de tabla de tokens Almacena todos los nombres declarados en el programa y sus atributos (tipo, valor, dirección, parámetros, etc.). Funciones Verificar que la sintaxis sea correcta Ayudar en la generación apropiada de código. Ambas funciones se realizan insertando o recuperando desde la tabla de símbolos los atributos de las variables usadas en el programa fuente. Atributos Tales como: el nombre, tipo, dirección de almacenamiento y dimensión de una variable, usualmente se encuentran explícitamente en las declaraciones o más implícitamente a través del contexto en que aparecen los nombres de variables en el programa. Objetivo Registrar información que se comparte entre varias etapas y que permite administrar los recursos asociados a las entidades que manipulará el programa. Ejemplo if Plazo >= 30 then Tasa := Base + Recargo / 100 else Tasa := Base [if] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base] [59] [Plazo] [>=] [30] [then] [Tasa] [:=] [Base] [+] [Recargo] [/] [100] [else] [Tasa] [:=] [Base] [59] [27] [80] [28] [60] [27] [85] [27] [70] [27] [73] [28] [61] [27] [85] [27]
IF ID >= CTE THEN ID := ID + ID / CTE ELSE ID := ID