IDENTIFICACION DE LEXAMAS COMPONENTES LEXICOS Y PATRONES A
PARTIR DE UN LENGUAJE.
Cuando se mencionan los términos “componentes léxicos” – token –, “patrón” y
“lexema” se emplean con significados específicos. En general, hay un conjunto de
cadenas
en la entrada para el cual se produce como salida el mismo componente léxico.
Este
conjunto de cadenas se describe mediante una regla llamada patrón asociado al
componente léxico. Se dice que el patrón concuerda con cada cadena del
conjunto. Un
lexema es una secuencia de caracteres en el programa fuente con la que
concuerda el
patrón para un componente léxico [Aho88]. Por ejemplo, en la preposición de
Pascal
const p:i=3.1416;
la subcadena pi es un lexema para el componente léxico “identificador”. En la
figura 1.3
aparecen ejemplos de los usos de componentes léxicos, patrones y lexemas.
Figura 1.3: Componentes léxicos, lexemas y patrones.
Los componentes léxicos se tratan como símbolos terminales de la gramática del
lenguaje fuente – en la figura 1.3 se representan con nombres en negritas –. Los
lexemas
para el componente léxico que concuerdan con el patrón representan cadenas de
caracteres
en el programa fuente que se pueden tratar como una unidad léxica.
En la mayoría de los lenguajes de programación, se consideran componentes
léxicos a las siguientes construcciones: palabras clave, operadores,
identificadores,
constantes, cadenas literales y signos de puntuación como por ejemplo paréntesis,
coma,
punto y coma. En el ejemplo anterior, cuando la secuencia de caracteres nom
aparece en el
programa fuente, se devuelve al analizador sintáctico un componente léxico que
representa
un identificador. La devolución de un componente léxico a menudo se realiza
mediante el
paso de un número entero correspondiente al componente léxico. Este entero es
al que hace
referencia el nom en negritas de la figura 1.3.
3
Un Generador de Analizadores Léxicos Traductores
Un patrón es una regla que describe el conjunto de lexemas que pueden
representar
a un determinado componente léxico en los programas fuentes. El patrón para el
componente léxico while de la figura 1.3 es simplemente la cadena sencilla while
que
deletrea la palabra clave. El patrón para el componente léxico relación es el
conjunto de
los seis operadores relacionales de Pascal. Para describir con precisión los
patrones para
componentes léxicos más complejos, como identificador y natural – para los
números
naturales –, se utilizará la notación de expresiones regulares desarrollada en la
siguiente
sección.
CONOCER LOS ELEMENTOS DE UNA TABLA DE TOKENS
a creación de la tabla de Tokens compete inicialmente al analizador de léxico,
quien registrará a las entidades (reconocidas bajo el patrón de Identificador) de
manera única, por medio del binomio de operaciones Búsqueda-Inserción.
Cuando construir la tabla de tokens
la tabla de símbolos es creada durante el paso de análisis léxico. Por medio de un
índice se entra a la tabla de símbolos para ubicar la variable, a partir del token
generado por el scanner.
Tipos de Tokens
Tokens
Símbolos terminales de una gramática, identificadores, palabras reservadas,
operadores.
Varios signos pueden formar un mismo token.
Atributos:
Información adicional que significa algo a la hora de compilar
Creación
La Tabla de Tokens es una serie de renglones, cada uno de los cuales contiene
una lista de valores de atributos que son asociados con una variable en particular
Una tabla de símbolos provee la siguiente información:
Analizador Léxico
Es tambien conocido como scanner y este aísla el analizador sintáctico de la
representación de lexemas de los componentes léxicos.
El analizador léxico opera bajo petición del analizador sintáctico devolviendo un
componente léxico conforme el analizador sintáctico lo va necesitando para
avanzar en la gramática.
Tabla de Tokens
Componentes léxicos
Es otra manera de llamar a los tokens y es la unidad mínima de información que
significa algo a la hora de compilar
-Da un Identificador
-Que información es asociada con un nombre
-como se asocia esa información con un nombre
-como acceder a esta información
Cadenas Especificas
Pero las dos funciones importantes que realizan las tablas Tokens en el proceso
de traducción son:
-Verificar que la semántica sea correcta
-Ayudar en la generación apropiada de código.
Este tipo de tokens son como las palabras reservadas (if o While), signos de
puntuación (., ,, = ...), operadores aritméticos (+,*,...) y lógicos (AND, OR, ...) Y no
tienen asociado ningún valor, solo su tipo
Cadenas no especificas
Este tipo de token son los identificadores o las contantes numéricas o de texto.
Estas siempre tienen un tipo y valor.
Por ejemplo, si dato es el nombre de una variable, el tipo del token será
identificador y su valor será dato
IDENTIFICAR PATRONES VALIDOS GENERAR AUTOMATAS Y TABLA DE
TOKENS DEL LENGUAJE PROPUESTO
Análisis lexicológico.
La entrada de un compilador es el código de un programa escrito en un lenguaje
de programación. Dicho código no es más que una secuencia de símbolos
pertenecientes al alfabeto del lenguaje de programación. El analizador lexicológico
o scanner se encarga de tomarlos y agruparlos en entidades sintácticas simples o
elementales denominadas tokens o lexemas. Las categorías de tokens pueden
variar de un lenguaje a otro, pero en general se distinguen las siguientes:
palabras reservadas
identificadores
constantes numéricas y literales
operadores
A cada token se le asigna una estructura lexicológica consistente en un par de la
forma <tipo del token, info>. La primera componente es una categoría sintáctica
como “constante”, “identificador”, “operador”, etc., y la segunda componente
proporciona información relacionada con el token en particular (valor de la
constante, índice del símbolo en la tabla de símbolos, etc.). Podemos afirmar, por
lo tanto, que el scanner es un traductor cuya entrada es una cadena de símbolos
(programa fuente) y cuya salida es una secuencia de estructuras lexicológicas o
tokens.
Operaciones sobre la tabla de símbolos.
Una tarea fundamental en un compilador es la de almacenar
los identificadores utilizados en un programa y sus atributos principales, de
manera que en cualquier momento pueda conocerse de un identificador, su tipo,
alcance, etc., para el caso de los procedimientos, la cantidad y tipo de los
parámetros, etc. Esta información se almacena generalmente en una estructura
conocida como tabla de símbolos, la cual tiene una entrada para cada identificador
y sus atributos. Los tokens que representan constantes o identificadores se
almacenan en la tabla de símbolos a medida que van apareciendo.
Ejemplo: 1 a Variable real 2 b Variable real 3 c Variable real 4 7 constante entera
Cuando el lenguaje fuente es de alto nivel (Pascal, C++, etc.) y el lenguaje objeto
es un lenguaje de bajo nivel o de máquina, al traductor se le denomina compilador.
El lenguaje de implementación puede ser en general cualquier lenguaje de
programación, aunque existen lenguajes explícitamente diseñados para escribir
compiladores (FSL, CDL, etc.). El criterio fundamental que se sigue para elegir un
lenguaje de implementación es: “Este debe minimizar el esfuerzo de
implementación y maximizar la calidad del compilador”. Generalmente los
traductores se representan a través de una T en la que se incluyen los lenguajes
que intervienen en el proceso.
Intérprete por su parte es un programa que toma el código fuente, lo analiza y
a diferencia de los compiladores lo ejecuta directamente, sin generar un
lenguaje objeto.
REGLAS DE UN LENGUAJE DE PROGRAMACION PROPIO
DISTINGUIR LOS ERRORES LEXICOS
Errores léxicos
El análisis léxico constituye la primera fase, aquí se lee el programa fuente de
izquierda a derecha y se agrupa en componentes léxicos (tokens), que son
secuencias de caracteres que tienen un significado. Además, todos los espacios
en blanco, líneas en blanco, comentarios y demás información innecesaria se
elimina del programa fuente. También se comprueba que los símbolos del
lenguaje (palabras clave, operadores,...) se han escrito correctamente.
Como la tarea que realiza el analizador léxico es un caso especial de coincidencia
de patrones, se necesitan los métodos de especificación y reconocimiento de
patrones, y éstos métodos son principalmente las expresiones regulares y
los autómatas finitos. Sin embargo, un analizador léxico también es la parte del
traductor que maneja la entrada del código fuente, y puesto que esta entrada a
menudo involucra un importante gasto de tiempo, el analizador léxico debe
funcionar de manera tan eficiente como sea posible.
Son pocos los errores simplemente en el nivel léxico ya que tiene una visión muy
restringida de un programa fuente. El analizador léxico debe devolver el
componente léxico de un identificador y dejar a otra fase se ocupe de los errores.
Suponga que una situación en la cual el analizador léxico no puede continuar por
que ninguno de los patrones concuerda con un prefijo de la entrada. Tal vez la
estrategia de recuperación más sencilla sea recuperación “EN MODO PANICO”
(este método de recuperación es donde se borra caracteres sucesivos de la
entrada hasta que el analizador léxico pueda encontrar un componente léxico bien
formado). ¡¡Los programas no siempre son correctos!!
El compilador tiene que:
1. Reportar clara y exactamente la presencia de errores
2. Recuperarse de cada error lo suficientemete rápido para poder detectar
errores subsiguientes:
Tratar de evitar mensajes falsos de error
Un error que produce un token erroneo
Errores léxicos posibles
Un token o componente léxico es una cadena de caracteres que tiene un
significado coherente en cierto lenguaje de programación. Ejemplos de tokens,
podrían ser palabras clave (if, while, int), identificadores, números, signos, o un
operador de varios caracteres. Son los elementos más básicos sobre los cuales se
desarrolla toda traducción de un programa, surgen en la primera fase, llamada
análisis léxico.