Programacion de Sistemas
 
  UNIVERSIDAD DE LEON
  Indice de Unidades
  1 Computabilidad y Lenguajes
  1.1 Estructura de un Compilador
  1.2 Paradoja de Russel
  1.3 Conjuntos Ordenados
  1.4 Maquina de Estados Infinitos
  2 Procesamiento de Lenguajes
  2.1 Definicion de Gramatica
  2.2 Analisis Lexico
  2.3 Definicion de Sintaxis
  2.4 Precedencia de Operadores
  2.6 Asociatividad de los Operadores
Todos los derechos reservados Lucero M. R. Copyright
2.2 Analisis Lexico

ANALISIS LEXICO

El analizador de léxico lee el flujo de caracteres que componen el programa fuente y los agrupa en secuencias significativas, conocidas como lexemas.

 

También el scanner tiene como función desechar espacios en blanco y comentarios entre los tokens

Para cada lexema, el analizador léxico produce como salida un token de la forma:

(nombre-token, valor-atributo)

Este token, pasa a la siguiente fase, el análisis de la sintaxis.

En el token, el primer componente nombre-token, es unsímbolo abstracto que se utiliza durante el análisis sintáctico, y el segundo componente valor-atributo, apunta a una entrada en la salida en la tabla de símbolos para este token.

La información de la entrada en la tabla de símbolos se necesita para el análisis semántico y la generación de código.

 

Por ejemplo, supongamos que un programa fuente contiene la instrucción de asignación:

Posicion = inicial + velocidad * 60

Los caracteres de esta asignación podrían agruparse en los siguientes lexemas y mapearse a los siguientes tokens que se pasan al analizador sintáctico:

 

1) Posicion es un lexema que se asigna a un token (id,1), en donde id es un símbolo abstracto que representa la palabra identificador y 1 apunta a la entrada en la tabla de símbolos para posicion. La entrada en la tabla de símbolos para un identificador contiene información acerca de éste, como su nombre y tipo.

 

El símbolo de asignación = es un lexema que se asigna al token (=). Como este token no necesita un valor-atributo, hemos omitido el segundo componente. Podríamos haber utilizado cualquier símbolo abstracto como asignar para el nombre-token, pero por conveniencia de notación optamos por usar el mismo lexema como el nombre del símbolo

Abstracto.

3) Inicial es un lexema que se asigna al token (id,2), en donde 2 apunta a la entrada en la tabla símbolos para inicial.

4) + es un lexema que se asigna al token (+)

5) Velocidad es un lexema que se asigna al token (id,3), en donde 3 apunta a la entrada en la tabla de símbolos para velocidad.

6) * es un lexema que se asigna al token (*)

7) 60 es un lexema que se asigna al token (60)

_ El analizador léxico ignora los espacios en blanco que separan a los lexemas.

En la siguiente figura, se muestra la representación de la instrucción:

 

 posicion = inicial + velocidad * 60

Después del análisis léxico, la secuencia de tokens:

(id,1) (=) (id,2) (+) (id,3) (*) (60)

En esta representación los nombres de los tokens =,+ y * son símbolos abstractos para los operadores de asginación, suma y multiplicación, respectivamente.




Tokens de puntuación como IF, VOID y RETURN son llamadas palabras reservadas y en la mayoría de los lenguajes no pueden usarse como identificadores.

Manejo de “Buffers”

El analizador de léxico (scanner) y el analizador de sintáxis (parser) forman un duo “productorconsumidor”.

 

El scanner produce tokens y el parser los consume.

La implementación de la lectura de los caracteres de la entrada (disco) es usualmente hecha por un buffer (memoria) que contendrá una buena parte de la entrada, desde donde el scanner irá formando los tokens. Esto agiliza la entrada que de otra forma leería carácter por carácter desde el disco.

Creación de la Tabla de Símbolos.

 La tabla de símbolos es una estructura de datos muy importante en casi todo el proceso de compilación. En ella se guarda durante las primeras fases de compilación los nombres de los identificadores (símbolos) usados en el programa fuente, además de los atributos de cada uno de estos identificadores. Estos identificadores y símbolos junto con sus atributos serán usados posteriormente para realizar funciones como el chequeo de tipos, la asignación de memoria, generación de código objeto etc.

 

Manejo de Errores de Léxico

 

 Errores posibles detectados en el análisis de léxico son:

 

J Patrones de tokens que no coincidan con algún patrón válido.

Por ejemplo el token #### sería inválido en algunos L.P.

Caracteres inválidos para el alfabeto del el lenguaje.

Longitud de ciertos tokens demasiado larga.

 

Generadores de Código Léxico

 

La construcción de un scanner puede automatizarse por medio de un generador de analizadores de léxico.

El primer programa de este tipo que se hizo popular fue Lex (Lesk, 1975) que generaba un scanner en lenguaje C.

Hoy en día existen muchos programas de este tipo: Flex,

Zlex, YooLex, JavaCC, SableCC, etc.

Ejemplo: Javacc

Javacc (Java Compiler Compiler) es un generador de scanners y parsers (https://javacc.dev.java.net/).

Toma como entrada especificaciones de léxico (expresiones regulares) y sintáxis (gramática de contexto libre) y produce como salida un analizador de léxico y un parser recursivo decendente.

Se puede usar como pre-procesador de Javacc, a jjtree y a JTB para la construcción del árbol sintáctico.







Tiempo  
   
Hoy habia 1 visitantes (1 clics a subpáginas) ¡Aqui en esta página!
Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis