LENGUAJES DE
PROGRAMACIÓN
CLASE N°3
CLASE N°3
Leissi M. Castañeda León
¿Que veremos hoy?
1. Introducción
1.- Introducción
Los sistemas que implementan ciertos lenguajes
deben analizar código fuente, de acuerdo con el
enfoque específico de implementación.
Todo el análisis sintáctico está basado en la
Introducción (cont.)
La parte de análisis sintáctico de un procesador
del lenguaje, consiste de dos partes:
Una parte de bajo nivel llamado analizador léxico
(matemáticamente, un autómata finito basado en una (matemáticamente, un autómata finito basado en una gramática regular).
Y una parte de alto nivel llamado analizador
Introducción (cont.)
El uso de BNF para describir la sintáxis tiene
las siguientes razones:
Provee una clara y concisa descripción de la
sintáxis
sintáxis
El parser puede estar basado directamente en la
descripción BNF
Los Parsers basados en BNF son fáciles de
Introducción (cont.)
Razones para separar el análisis léxico del
sintáctico:
Simplicidad
– Enfoques menos complejos pueden
ser usados para el análisis léxico; separándolos
simplifica el parser.
Eficiencia
– La separaración permite la
optimización del analizador léxico.
Portabilidad
– Algunas partes del analizador
2.- Análisis Léxico
Un analizador léxico es un emparejador de
patrones para cadenas de caracteres.
Un analizador léxico es un “front-end” para el
parser.
parser.
Busca en el fuente del programa a los
Lexemas
Se identifican los lexemas mediante un emparejador de patrones de caracteres, los cuales son asociados a una categoría léxica llamada token.
Análisis Léxico (cont.)
Consideremos el siguiente ejemplo
Antes: procesar todo el archivo fuente, y retornar los lexemas y
tokens.
Análisis Léxico (cont.)
Lo único que vera el analizador sintáctico es la
salida del analizador léxico, un lexema a la vez.
El análisis léxico ignora los comentarios,
El análisis léxico ignora los comentarios,
espacios en blanco, pues no tienen ningún
significado dentro del programa.
El analizador léxico detecta errores sintácticos
Análisis Léxico (cont.)
El analizador léxico es un función que usualmente
llamada por el parser cuando necesita el siguiente token.
Tres enfoques para construir un analizador lexico:
Escribir una descripción formal de los tokens y usar una
herramienta software que construya una tabla-manejadora dada herramienta software que construya una tabla-manejadora dada una descripción de los analizadores léxicos
Diseñar un diagrama de estados que describa los tokens y escribir
un programa que implemente el diagrama de estados
Diseñar un diagrama de estados que describa los tokens y
construir a mano una implementacion de tabla-manejadora del diagrama de estados
Análisis Léxico (cont.)
Diseño del diagrama de estados:
Es un grafo dirigido
los nodos son etiquetados con nombres de estados
los arcos son etiquetados con los caracteres entrantes que
causan dichas transiciones causan dichas transiciones
Los arcos contienen ademas accioens que debe realzar
elanalizador lexico cuando una transición es tomada
Un diagrama de estados ingenuo debería tener una transición para cada estado en cada caracter en la fuente del lenguaje
Análisis Léxico (cont.)
En muchos casos, las transiciones pueden ser
combinadas para simplificar el diagrama de
estados.
Cuando se reconoce un identificador, todas las letras mayúsculas y minúsculas son equivalentes.
mayúsculas y minúsculas son equivalentes.
Usar una clase caracter que incluya todas las letras.
Cuando se reconoce un literal entero, todos los dígitos son equivalentes.
Análisis Léxico (cont.)
Las palabras reservadas e identificadores
pueden ser reconocidos juntos (en vez de tener
una parte del diagrama para cada palabra
reservada)
Usar una tabla de búsqueda para determinar si un posible identificador es de hecho una palabra
Análisis Léxico (cont.)
Subprogramas utilitarios convenientes:
getChar - obtiene el siguiente caracter de la entrada, lo coloca dentro de la variable global nextChar,
tambien determina su clase y coloca la clase en en la variable global charClass
variable global charClass
addChar – pone el caracter proveniente de nextChar dentro del lugar del que el lexema se está acumulando,
lexeme
lookup - determina si una cadena en el lexeme es una palabra reservada (retorna el token asociado si es
Análisis Léxico (cont.)
Implementación (se asumen inicializaciones):
int lex() {
getChar();
switch (charClass) {
case LETTER:
addChar(); addChar();
getChar();
while (charClass == LETTER || charClass == DIGIT)
Análisis Léxico (cont.)
…
…
…
…
case DIGIT: addChar(); getChar();while (charClass == DIGIT) {
addChar();
getChar();
}
return INT_LIT;
break;
} /* Fin de switch */