Sunteți pe pagina 1din 6

Garcia Caltzoncin Luis Eduardo - Lenguajes y Autómatas-

Martha Beatriz Coronado Rosales-ISC


5.3 Creación de Tabla de tokens.
Tabla: conjunto de pares clave-valor, llamados elementos de la tabla. La tabla de
símbolos es una componente necesaria de un compilador. Al declarar un
identificador (normalmente una sola vez), éste es insertado en la tabla. Cada vez
que se utilice el identificador se realizará una búsqueda en la tabla para obtener la
información asociada (el valor).

 Búsqueda: dada la clave de un elemento, encontrar su valor.


 Inserción: Dado un par clave-valor, añadir un elemento nuevo a la tabla.
 Cambio de valor: Buscar el elemento y cambiar su valor.
 Borrado: Eliminar un elemento de la tabla.
 Longitud de búsqueda (o tiempo de acceso)

De una clave: Li = número de comparaciones con elementos de la tabla para


encontrar esa clave. Máxima: LM = número máximo de comparaciones para
encontrar cualquier clave. Media (esperada): Lm = número medio de
comparaciones para encontrar un valor.

Si la frecuencia de todas las claves es la misma:


Lm = (S Li)/N
Si la frecuencia de todas las claves no es la misma:
Lm = S pi.Li
Grado de ocupación:
s = n/N donde n=número de elementos en la tabla y N=capacidad máxima de la tabla.
Función de búsqueda: B : K→E asocia a cada clave k un elemento B(k).

Valor asociado a una clave k: v(B(k)). Puede ser múltiple, en cuyo caso
normalmente se convierte en un puntero. Si está en la tabla puede almacenarse
consecutivamente o en subtablas paralelas. Tablas de símbolos (identificadores) La
clave es el identificador. El valor está formado por:

 Atributos del identificador. Puntero a la posición de memoria asignada. La


clave puede sustituirse por un puntero. Los identificadores pueden estar
empaquetados. La longitud del identificador puede especificarse en la tabla
o delante del nombre, o ser implícita.

 Tablas consecutivas: Todos los elementos ocupan posiciones de memoria


adyacentes. Tablas ligadas: cada elemento apunta al siguiente. Tablas
doblemente ligadas: cada elemento apunta al siguiente y al anterior. Tablas
no ordenadas Inserción: en el primer lugar vacío.

https://lenguajesyautomatasblog.wordpress.com/2017/05/15/tabla-de-tokens/
Garcia Caltzoncin Luis Eduardo - Lenguajes y Autómatas-
Martha Beatriz Coronado Rosales-ISC
Tabla: conjunto de pares clave-valor, llamados elementos de la tabla. La tabla de símbolos es una
componente necesaria de un compilador. Al declarar un identificador (normalmente una sola vez),
éste es insertado en la tabla. Cada vez que se utilice el identificador se realizará una búsqueda en
la tabla para obtener la información asociada (el valor).

Búsqueda: dada la clave de un elemento, encontrar su valor.

Inserción: Dado un par clave-valor, añadir un elemento nuevo a la tabla.

Cambio de valor: Buscar el elemento y cambiar su valor.

Borrado: Eliminar un elemento de la tabla.

Longitud de búsqueda (o tiempo de acceso)

De una clave: Li = número de comparaciones con elementos de la tabla para encontrar esa clave.
Máxima: LM = número máximo de comparaciones para encontrar cualquier clave. Media
(esperada): Lm = número medio de comparaciones para encontrar un valor. Si la frecuencia de
todas las claves es la misma:

Lm = (S Li)/N

Si la frecuencia de todas las claves no es la misma:

Lm = S pi.Li

Grado de ocupación:

s = n/N donde n=número de elementos en la tabla y N=capacidad máxima de la tabla.

Función de búsqueda: B : K→E asocia a cada clave k un elemento B(k).

Valor asociado a una clave k: v(B(k)). Puede ser múltiple, en cuyo caso normalmente se convierte
en un puntero. Si está en la tabla puede almacenarse consecutivamente o en subtablas paralelas.
Tablas de símbolos (identificadores) La clave es el identificador. El valor está formado por:

Atributos del identificador. Puntero a la posición de memoria asignada. La clave puede sustituirse
por un puntero. Los identificadores pueden estar empaquetados. La longitud del identificador
puede especificarse en la tabla o delante del nombre, o ser implícita.
Garcia Caltzoncin Luis Eduardo - Lenguajes y Autómatas-
Martha Beatriz Coronado Rosales-ISC
Tablas consecutivas: Todos los elementos ocupan posiciones de memoria adyacentes. Tablas
ligadas: cada elemento apunta al siguiente. Tablas doblemente ligadas: cada elemento apunta al
siguiente y al anterior. Tablas no ordenadas Inserción: en el primer lugar vacío.

http://10380054.galeon.com/u5.htm

El analizador léxico, también conocido como scanner, lee los caracteres del
programa fuente, uno a uno, desde el fichero de entrada y va formando grupos de
caracteres con alguna relación entre sí (tokens). Cada token es tratado como una
única entidad, constituyendo la entrada de la siguiente fase del compilador.

Existen diferentes tipos de tokens y a cada uno se le puede asociar un tipo y, en


algunos casos, un valor. Los tokens se pueden agrupar en dos categorías:

Cadenas especificas, como las palabras reservadas (if, while, ...), signos de
puntuación (., ,, =, ...), operadores aritméticos (+,*, ...) y lógicos (AND, OR, ...),
etc. Habitualmente, las cadenas especificas no tienen asociado ningún valor, sólo
su tipo.

Cadenas no especificas, como los identificadores o las constantes numéricas o de


texto. Las cadenas no especificas siempre tienen tipo y valor. Por ejemplo, si dato
es el nombre de una variable, el tipo del token será identificador y su valor será dato.

A la tabla de Tokens también se la llama tabla de nombres o tabla de


identificadores y tiene dos funciones principales:
 Efectuar chequeos semánticos.
 Generación de código.
Permanece sólo en tiempo de compilación, no de ejecución, excepto en aquellos
casos en que se compila con opciones de depuración.
La tabla almacena la información que en cada momento se necesita sobre las
variables del programa, información tal como: nombre, tipo, dirección de
localización, tamaño, etc. La gestión de la tabla de símbolos es muy importante, ya
que consume gran parte del tiempo de compilación. De ahí que su eficiencia sea
crítica. Aunque también sirve para guardar información referente a los tipos
creados por el usuario, tipos enumerados y, en general, a cualquier
identificador creado por el usuario, nos vamos a centrar principalmente en las
variables de usuario. Respecto a cada una de ellas podemos guardar:

 Almacenamiento del nombre.


Se puede hacer con o sin límite. Si lo hacemos con límite, emplearemos una
longitud fija para cada variable, lo cual aumenta la velocidad de creación, pero
Garcia Caltzoncin Luis Eduardo - Lenguajes y Autómatas-
Martha Beatriz Coronado Rosales-ISC
limita la longitud en unos casos, y desperdicia espacio en la mayoría. Otro método
es habilitar la memoria que necesitemos en cada caso para guardar el nombre.
En C esto es fácil con los char *. Si hacemos el compilador en MODULA-2, por
ejemplo, habría que usar el tipo ADDRESS.

 El tipo también se almacena en la tabla.

 Dirección de memoria en que se guardará.


Esta dirección es necesaria, porque las instrucciones que referencian a una
variable deben saber dónde encontrar el valor de esa variable en tiempo de
ejecución, también cuando se trata de variables globales. En lenguajes que no
permiten recursividad, las direcciones se van asignando secuencialmente a
medida que se hacen las declaraciones. En lenguajes con estructuras de bloques,
la dirección se da con respecto al comienzo del bloque de datos de ese bloque,
(función o procedimiento) en concreto.

 El número de dimensiones de una variable array, o el de parámetros de una


función o procedimiento junto con el tipo de cada uno de ellos es útil para el
chequeo semántico. Aunque esta información puede extraerse de la estructura
de tipos, para un control más eficiente, se puede indicar explícitamente.

 También podemos guardar información de los números de línea en los que se


ha usado un identificador, y de la línea en que se declaró.
Consideraciones sobre la Tabla de Símbolos.

La tabla de símbolos puede iniciarse con cierta información útil, tal como:

 Constantes: PI, E, etc.


 Funciones de librería: EXP, LOG, etc.
 Palabras reservadas. Esto facilita el trabajo al lexicográfico, que tras reconocer
un identificador lo busca en la tabla de símbolos, y si es palabra reservada
devuelve un token asociado.

https://es.scribd.com/document/225947303/5-3-Creacion-de-Tablas-Token
Garcia Caltzoncin Luis Eduardo - Lenguajes y Autómatas-
Martha Beatriz Coronado Rosales-ISC
5.4 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 estos 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 porque
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 suficientemente rápido para poder detectar
errores subsiguientes:

Tratar de evitar mensajes falsos de error


Un error que produce un token erróneo
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.

http://10380054.galeon.com/u5.htm
Garcia Caltzoncin Luis Eduardo - Lenguajes y Autómatas-
Martha Beatriz Coronado Rosales-ISC

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 estos 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


porque 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:

 Reportar clara y exactamente la presencia de errores


 Recuperarse de cada error lo suficientemente rápido para poder detectar
errores subsiguientes:
 Tratar de evitar mensajes falsos de error.
 Un error que produce un token erróneo.
 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.

https://lenguajesyautomatasblog.wordpress.com/2017/05/15/errores-lexicos/

S-ar putea să vă placă și