Vous êtes sur la page 1sur 55

m m

   
 
   m    

V   


  
 V

Ô  



 
 


 

Õ  
!"  

› 

› 

Notación formal para


describir algoritmos o
funciones que serán
ejecutadas por un
ordenador
Õ  
!"  

§egún su grado de independencia de la


máquina (lenguaje máquina, ensamblador,
de medio nivel, de alto nivel, orientados a
problemas concretos.

§egún la forma de sus instrucciones


(Lenguajes imperativos o procedimentales,
declarativos, concurrentes, orientados a
objetos.

Por generaciones (1a generación, 2a


generación, 3a generación, 4a generación,
5a generación, generación orientada a
objetos, visual, internet)
Õ  
!"  

No se necesita conocer la
forma en que se colocan
los datos en memoria Gran variedad de
Más fáciles de estructuras de
aprender control
Mentajas de los
Mayor capacidad Lenguajes de Alto Nivel Diseño modular
de creación de de programas
estructuras de
datos §oporte para la
P.O.O.
Los programas se depuran
más fácilmente que los Relativamente
escritos en lenguaje máquina independientes
o ensamblador de la máquina
Õ  
!"  

|raductor V V

V

ënsamblador
Lenguaje ensamblador      Lenguaje máquina

›ompilador
   
Lenguaje de alto nivel Lenguaje máquina
Õ  
!"  

Montadores de enlace y cargadores


    
 m

V V  


 
         
 
      


      
 


 

 


 

 


 

 

 m

  

Õ  
!"  

6ntérpretes
Programa     Lenguaje
Resultados
fuente máquina

Programa   
fuente Resultados

Decompilador
Lenguaje máquina     Lenguaje de alto
nivel

Desensamblador
Lenguaje máquina      Lenguaje
ensamblador
Õ  
!"  

Depuradores
Herrramientas que permiten encontrar y corregir errores de los
programas (suelen ir ligados a los compiladores)

Analizadores de rendimiento
Herramientas que permiten examinar el comportamiento de los
programas en tiempo de ejecución, permitiendo comprobar qué zonas
de código trabajan eficientemente y cuáles deberían ser revisadas por
su bajo rendimiento.
Optimizadores de código
Herramientas independientes o están incluidas en los compiladores
que optimizan la velocidad de ejecución, tamaño de código ejecutable,
eliminación de código muerto o no utilizado, funciones no utilizadas, etc.
›ompresores
Herramienta habitual para reducir el tamaño de archivos, (ficheros
ejecutables). W6N Z6P
Õ  
!"  

Preprocesadores
›aso especial de traductor. |raduce un lenguaje de alto nivel a
´otroµ, cuando el primero no puede pasar a lenguaje máquina
directamente. Procesan un texto fuente modificándolo en cierta forma
previamente a la compilación.

Formateadores
ëstablen cierto ´formatoµ. De muchos tipos y diferentes fines:
formatear texto, formatear ecuaciones, formatear programas (resaltan
la sintaxis a su estructura para lo cual es necesario conocer la sintaxis
del programa a formatear). ›onversores de formato.
ëditores
Los editores de lenguajes de programación con sintaxis resaltada por
medio de colores o tipos de letra permiten llamar la atención del
programador en el momento mismo que está escribiendo el programa,
sin necesidad de compilar, dado que llevan incorporada la sintaxis del
lenguaje.
Õ  
!"  

›ompilador
   
  m     
Lenguaje de alto nivel Lenguaje máquina

Para cada lenguaje de programaci n se requiere un compilador separado.


El compilador traduce todo el prgrama antes de ejecutarlo.
os programas compilados se ejecutan m s r pido que los interpretados,
debido a que han sido completamente traducidos a lenguaje m quina.
6nforma al usuario de la presencia de errores en el programa fuente.
Poseen un editor integrado con un sistema de coloreado para los
comandos, funciones, variables dem s partes de un programa.
Õ  
!"  

Metacompilador Autocompilador
›ompilador
cruzado
ënsamblador

›ompilador de
montaje y
›ompilador ejecución
›ompilador de
incremental
pasadas múltiples

›ompilador ›ompilador en
optimización una pasada
Õ  
!"  
Proceso de
 !"#$"
›ompilación
    

     

     

    
  
      
 
 
     

   


  


%&"$
"V  V#$ 

ëlimina del programa fuente comentarios y espacios en blanco.


Relaciona los mensajes de error con el lenguaje fuente.
 "V  V#$ 

›omponente l xico (token)


›onjunto de cadenas de entrada que produce como salida el mismo
componente l xico:
- palabras clave - cadenas
- operadores - literales
- identificadores - signos de puntuaci n
- constantes
- exema epresentan cadenas de caracteres en el programa fuente que se
pueden tratar juntos como una unidad l xica.
Patr n egla que describe el conjunto de lexemas que pueden representar a
un determinado componente l xico en los programas fuente.

tributos de los componentes l xicos.


puntador a la entrada de la |abla de símbolos donde se guarda la
informaci n sobre el componente l xico.
El lexema para un identificador.
El n mero de línea en que se encontr por primera vez.
 "V  V#$ 

ël analizador léxico es la única fase del compilador que lee el programa


fuente carácter a carácter, por lo que es posible que se consuma mucho
tiempo en la fase de análisis léxico, aunque las fases posteriores sean
más complejas.

La velocidad del análisis léxico supone un problema en el diseño de


compiladores.

›omo se puede consumir mucho tiempo moviendo caracteres, se han


desarrollado técnicas especializadas en el manejo de buffers para
reducir el número de operaciones necesarias para procesar un caracter
de entrada.
 "V  V#$ 

Pareja de Buffers

›entinelas
 "V  V#$ 

ëxpresiones regulares
Notación para especificar patrones. ›ada patrón concuerda con una
serie de cadenas, de modo que las expresiones regulares servirán como
nombres para conjuntos de cadenas.
Las expresiones regulares se utilizan para describir los componentes
léxicos de un lenguajes o tokens. Las expresiones regulares utilizan varios
tipos de operadores para definir los componentes léxicos:
‡Paréntesis. Para agrupar símbolos
‡Operación concatenación. §e permite la concatenación de cadenas.
‡Operación alternativa. §e representa por |, y permite la elección entre
dos o más alternativas.

NO|A: Una expresión regular se construye a partir de expresiones


regulares más simples.
 "V  V#$ 

Por conveniencia de notación, es deseable dar nombres a las expresiones


regulares. Para distinguir los nombre de los símbolos, se imprimen en
negritas los nombres de las definiciones regulares.
id † letra (letra|digito)*
const † digito*

Abreviaturas en la notación
1. Uno o más casos de. +

2. ›ero o un caso. ?

3. ›lases de caracteres.
Notación abreviada para las expresiones regulares.
a|b|c|d|...|z ›lase de caracteres: [a-z]
a|b|c [abc]
0|1|2|3|«|9 [0-9]
id [A-Za-z] [A-Za-z0-9]*

›onjuntos no regulares
Aquellos lenguajes que no se pueden describir con ninguna expresión
regular.
 "V  V#$ 

Para estudiar el reconocimiento de los componentes léxicos, consideraremos el


siguiente formato gramatical:
prop if expr prop
| if expr prop else prop | U
expr termino oprel termino | termino
termino id | num

donde, los terminales if, else, operel, id y num generan conjuntos de cadenas
dados por las siguientes definiciones regulares:
if if
else else
operel < | <= | = | <> | > | >=
6d letra (letra|digito)
num digito (.digito ) ( ë(+|-) digito )
letra y digito (se definieron anteriormente)
 "V  V#$ 

§e supone que los lexemas están separados por espacios en blanco,


formados por secuencias no nulas de espacios en blanco, caracteres
|AB y caracteres de nueva línea. ël analizador léxico eliminará los
espacios en blanco ësto lo hará comparando una cadena con la
definición de la expresión regular eb siguiente:

delim blanco | tab | lineanueva


eb delim

§i se encuentra una concordancia para eb, el analizador léxico no


devuelve un componente léxico al analizador sintáctico, sino que se
dispone a encontrar un componente léxico a continuación del espacio
en blanco y lo devuelve al analizador sintáctico.
"V     

#  
    $  


 Ú   Ú  
$
 
  
  
 
  
 

 
!"

   
  

La entrada al analizador sintáctico se examina de izquierda a derecha, un


símbolo a la vez.

La salida del analizador sintáctico es una representación del árbol de


análisis sintáctico para la cadena de componenetes léxicos producidos
por el analizador léxico.
 "V     

Análisis sintáctico Análisis sintáctico


descendente. Analizadores sintácticos ascendente.
›onstruye árboles de para gramáticas ›onstruyen árboles
análisis sintáctico de análisis sintáctico
desde arriba (raíz) comenzando en las
hacia abajo (hojas). hojas y suben hacia la
raíz.

Una gramática independiente de contexto (granática) describe de forma


natural la estructura jerárquica de muchas construcciones de los
lenguajes de programación. ›onsta de:

|erminales
No terminales
Un símbolo inicial
Producciones
 "V     

‡|erminales. §ímbolos básicos con que se forman las cadenas


(palabra clave/reservada).
‡ No terminales. Denotan conjuntos de cadenas que ayudan a definir el
lenguaje generado por la gramática. 6mponen una estructura jerárquica
sobre el lenguaje que es útil tanto para el análisis sintáctico como para la
traducción.
‡ Un símbolo inicial. ën una gramática es un no terminal que representa
un conjunto de cadenas.
‡ Producciones. ëspecifican cómo se pueden combinar los terminales y
no terminales para formar cadenas. ›ada producción consta de un No
terminal (símbolo inicial), seguido por una flecha o símbolo de asignación,
seguida por una cadena de no terminales y terminales.

prop if expr prop else prop


 "V     

Razones para utilizar expresiones regulares para definir la


sintaxis léxica de un lenguaje.
Las reglas lexicogáficas de un lenguaje a menudo son bastante sencillas, y
para describirlas no se necesita una notación tan poderosa como las
gramáticas.
È Proporcionan una notación más concisa y más fácil de entender para los
componentes léxicos.
È §e construyen automáticamente analizadores léxicos más eficientes a
partir de expresiones regulares.
È Las expresiones regulares son muy útiles para describir identificadores,
constantes, palabras clave, etc.
È Las gramáticas son muy útiles para describir estructuras anidadas,
estructuras de control, etc.
 "V     

Análisis §intáctico Descendente §e considera un


intento de encontrar una derivación por la izquierda para una cadena de
entrada.
|ambién se puede considerar como un intento de construir un árbol de
análisis sintáctico para la entrada comenzando desde la raíz y creando
nodos del árbol en orden previo.

Análisis §intáctico Ascendente


ël análisis sintáctico
ascendente intenta construir un árbol para la cadena de entrada que
comienza por las hojas (el fondo) y avanza hacia la raíz (la cima).
§e puede considerar este proceso como de ´reducirµ una cadena x al
símbolo inicial de la gramática.
 "V     

Análisis §intáctico por Procedencia


de Operadores
ël análisis sintáctico
por procedencia de operadores es un manipulación de componentes
léxicos sin hacer referencia a ninguna gramática subyacente.
Una gramática de operadores cumple la propiedad de que ningún lado
derecho de la producción es ß ni tiene dos 2 no terminales adyacentes.

Análisis §intáctico
6zquierda-Derecha LR (k) |écnica eficiente de análisis
sintáctico ascendente. §e realiza un examen de la entrada de izquierda a
derecha, así también se contruye una derivación por la derecha.
Reconocen prácticamente todas las construcciones de los lenguajes de
programación para los que se pueden escribir gramáticas independientes
del contexto. Puede detectar un error sintáctico tan pronto como sea
posible hacerlo en un examen de izquierda a derecha de la entrada.
 "V     

Gramática ambigua es aquella que produce más de un árbol de análisis


sintáctico (derivación por la izquierda o por la derecha) para alguna frase.
Útiles en la especificación e implementación de lenguajes.
§e utiliza para el aislamiento de construcciones sintácticas habituales
para optimación en casos especiales.
›on una gramática ambigua se pueden especificar las construcciones
de casos especiales añadiendo cuidadosamente nuevas producciones a la
gramática.
Las construcciones ambiguas se deben usar raramente y de una manera
estrictamente controlada, pues de lo contrario no se puede reconocer con
seguridad el lenguaje que reconoce el analizador.
"V  " 

›ompleta las dos fases anteriores de análisis lexicográfico y


sintáctico incorporando ciertas comprobaciones que no pueden
asimilarse al mero reconocimiento de una cadena dentro de un lenguaje.
evisa el programa fuente para tratar de encontrar errores
semánticos y re ne la informaci n sobre los tipos para la fase posterior
de generaci n de c digo. En ella se utiliza la estructura jerárquica
determinada por la fase de análisis sintáctico para identificar los
operadores y operandos de expresiones y proposiciones.
 "V  " 

Merificador de |ipos
›omponente importante del análisis
semántico. Aquí, el compilador verifica si cada operador tiene
operandos permitidos por la especificación del lenguaje fuente.

Proporcionan el significado a una sentencia o instrucción del lenguaje.

ëvaluación de reglas semánticas


Define los valores de los
atributos en los nodos del árbol de análisis sintáctico para la cadena de entrada.
ëstablecen las dependencias entre los atributos que serán representados
mediante un grafo.
 "V  " 

   Ú  #  ›    # 


„    

 
 
$
   
  

$
 
 
$

 
  

 x 
   
 
     
      
   
!"
 

›omprobador de |ipos
(estática y dinámica)

›omprobación Dinámica
§e realiza durante la
ejecución del programa objeto.
 "V  " 

›omprobación ëstática
›omprueba si el programa
fuente sigue las convenciones sintácticas y semánticas del lenguaje
fuente. Garantiza la detección y comunicación de algunas clases de
errores de programas.

›omprobaciones de |ipos. ›ompatibilidad entre operadores y


operandos. Aseguran que el tipo de una construcción coincida con el
previsto en su contexto.
›omprobaciones del flujo de control. Por ejemplo, proposiciones que
hacen que se abandone el flujo de control.

›omprobaciones de unicidad. Definir un objeto una sola vez


exactamente.
›omprobaciones relacionadas con nombres. A veces el mismo nombre
debe aparecer 2 ó más veces en un bloque de instrucciones, el compilador
debe comprobar que se utilice el mismo nombre en ambos sitios.
 "V  " 

6nformación acerca de las construcciones


Diseño de un sintácticas del lenguaje
se basa
comprobador de La noción de tipos
tipos Las reglas para asignar tipos a las
construcciones de lenguaje
›ada expresión tiene
asociado un tipo

Los tipos tienen estructura Denotan el tipo de una construcción

ës un tipo básico o se forma aplicando un


operador llamado constructor de tipos a otras
ë PRë§6ONë§ expresiones de tipos.
Dë |6PO
›ada lenguaje de programación requiere unas
expresiones de tipos adecuadas a sus
características.
 "V  " 

|ipos simples: 6nteger, real, char, boolean.

ëxpresiones de 6dentificadores: ›orrespondientes a los tipos


definidos por el usuario.
|ipos
›onstructores de tipos: |ipos complejos a
partir de otros más simples: Matrices, Productos,
Registros, Punteros, Funciones.

§istema de |ipos
§erie de reglas para asignar expresiones de tipos a las distintas partes
de un programa y verificar su corrección.
Lo forman las definiciones y reglas que permiten comprobar cuál es el
dominio asignado a una variable, y en qué contextos puede ser usada.
ël comprobador de tipos implanta el §istema de |ipos
6ncluye comprobaciones estáticas y dinámicas.
 "V  " 

6nstrucciones que realiza el compilador para convertir y garantizar que


los operandos sean de un mismo tipo cuando se tiene lugar determinada
operación.
Permite convertir enteros a reales.
§e puede utilizar el comprobador de tipos en un compilador para
insertar estas operaciones de conversión en la representación
intermedia del programa fuente.

ë PLϛ6|A 6MPL͛6|A
ël programador debe escribir §i la realiza el compilador
algo para motivar la conversión. automáticamente (coerciones)
 "V  " 

§obrecarga de funciones
§e presenta cuando un
símbolo tiene distintos significados dependiendo de su contexto
(operadores aritméticos).
§e resuelve cuando se determina un significado único para un caso de
un símbolo sobrecargado.

Funciones polimórficas
›ualquier parte de código que
puede ejecutarse con argumentos de tipos distintos (funciones,
operadores).
Facilitan la implantación de algoritmos que manipulan estructuras de
datos.
„  %Õ%Õ „
  Õ

Aunque un programa fuente se puede traducir directamente al


lenguaje objeto, algunas ventajas de utilizar una forma intermedia
independiente de la máquina son:

Se facilita la redestinaci n; se puede crear un compilador para


una máquina distinta uniendo una etapa final para la nueva
máquina a una etapa inicial a existente.
Se puede aplicar a la representaci n intermedia un optimizador
de c digo independiente de la máquina.
„  %Õ%Õ „
  Õ

Lenguajes intermedios
Los árboles sintácticos y la notación postfija son dos clases de
representaciones intermedias.

ëxpresiones booleanas
ën los lenguajes de programación, las expresiones booleanas tienen dos
propósitos principales. §e utilizan para calcular valores lógicos y como
expresiones condicionales en proposiciones que alteran el flujo del control,
como las proposiciones if-else o do-while.
Las expresiones booleanas se componen de los operadores
boleanos (and, or y not) aplicados a los elementos que son variables
booleanas o expresiones relacionales. Algunos lenguajes permiten
expresiones más generales donde se pueden aplicar operadores booleanos,
aritméticos y relacionales a expresiones de cualquier tipo, sin diferenciar
valores booleanos de aritméticos; si es necesario se realiza una coerción.
„  %Õ%Õ „
  Õ

ëxpresiones
Pueden ser de tipo entero, real, matriz , registros. ën la |abla de
§ímbolos se puede buscar los nombres de las expresiones y se puede
acceder a los elementos de matrices y registros.
ëstos nombres representan a las expresiones dentro de la |abla de
§ímbolos.

Declaraciones
›onforme se examina la secuencia de declaraciones dentro de un
procedimiento o un bloque, se puede distribuir la memoria para los nombres
locales al procedimiento. Para cada nombre local se crea una entrada en la
tabla de símbolos con información, por ejemplo, referente al tipo y la
dirección relativa de la memoria correspondiente al nombre.
La sintaxis de lenguajes como ›, Pascal y FOR|RAN permite que todas
las declaraciones en un solo procedimiento se procesen como un grupo.
„  %Õ%Õ „
  Õ

Llamadas a funciones/procedimientos
ës fundamental que un compilador genere buen código para llamadas
y retornos de funciones. La traducción de una llamada incluye una
secuencia de llamada, que es una secuencia de acciones que se toman
a la entrada y a la salida de cada función/procedimiento.
Aunque las secuencias de llamada difieren, incluso en aplicaciones del
mismo lenguaje, habitualmente tienen lugar las siguientes acciones:
›uando ocurre la llamada a un función, se debe asignar espacio para
el registro de activación del procedimiento llamado. Los argumentos
de la función llamada se deben evaluar y poner a disposición de la
función llamada en un lugar conocido. §e deben establecer los
apuntadores de ambiente para permitir que la función llamada tenga
acceso a los datos de las funciones abarcadoras.
„  %Õ%Õ „
  Õ

...§e debe guardar el estado de la función que efectúa la llamada para


que pueda reanudar la ejecución después de la llamada. |ambién se
guarda en un lugar conocido la dirección de retorno, que es la posición a
la que la rutina llamada debe transferir el control cuando finalice. La
dirección de retorno normalmente es la posición de la instrucción que
sigue la llamada en la función autor de la llamada. Por último, se debe
generar un salto al principio del código la función llamada.

No existe una división exacta de las tareas en el momento de la ejecución


entre la función que hace la llamada y la función que recibe la llamada.
A menudo, el lenguaje fuente, la máquina objeto y el sistema operativo
imponen requisitos que favorecen una solución sobre otra.

  &  %Õ%Õ „

|rata de mejorar el código intermedio de modo que resulte un código de


máquina más rápido de ejecutar.
Hay mucha variación en la cantidad de optimización de código que ejecutan
los compiladores. ën los que se hace mucha optimización, llamados
´›OMP6LADORë§ OP|6M6ZADOR맵 una parte significativa
del tiempo del compilador se ocupa en esta fase.
Hay optimizaciones sencillas que mejoran sensiblemente el tiempo de
ejecución del programa objeto sin retardar demasiado la compilación.
Opciones habituales de optimización: velocidad de ejecución, tamaño del
código ejecutable, eliminar la comprobación de rangos o desbordamientos de
pila, eliminación de código muerto o no utilizado, eliminación de funciones no
utilizadas.
„  %Õ%Õ „

Fase final de un compilador.

›onsiste, por lo general, en código máquina o código


ensamblador.

Las posiciones de memoria se seleccionan para cada una


de las variables usadas por el programa. Después, cada una
de las instrucciones intermedias se traduce a una secuencia
de instrucciones de máquina que ejecutan la misma tarea.
Õ   Õ
ÕV  !V Õ'!
V


Función esencial en un compilador

Registrar los identificadores utilizados en el programa fuente y


reunir información sobre los distintos atributos de cada identificador.

|abla de §ímbolos
ëstructura de datos que contiene
un registro por cada identificador con los campos para los atributos del
identificador.

La estructura de datos permite encontrar rápidamente el registro de


cada identificador y almacenar o consultar rápidamente datos de ese
registro.
 Õ   Õ
ÕV  !V Õ'!
V


Atributos para un
identificador/variable

Memoria asignada Atributos para una


función/procedimiento
|ipo
Ámbito (locales, globales) Número y datos de sus
argumentos
Línea de código en que se
encontró por primera vez Método para pasar cada
argumento (por referencia,
por valor)
|ipo de dato que
devuelve (si lo hay)
  Õ
Õ

Análisis léxico
Después de detectar un
Análisis sintáctico error, cada fase debe tratar
Análisis semántico de alguna forma ese error,
ëRRORë§ para poder continuar la
Gen. ›ód. 6nterm. compilación permitiendo la
detección de más errores en
Optimización cód. el programa fuente.
Genración código

Análisis sintáctico y
semántico

Manejan una gran porción de los


errores detectables por el
compilador
  Õ
Õ


Manejo de ërrores Léxicos


La fase léxica puede detectar errores donde los caracteres restantes
de la entrada no forman ningún componente léxico de lenguaje.
§on pocos los errores que se pueden detectar simplemente en el nivel
léxico porque un analizador léxico tiene una visión muy restingida de un
programa fuente.

´Modo pánicoµ (se borran caracteres


sucesivos de la entrada restante hasta que el
analizador léxico pueda encontrar un
ëstrategias de componente léxico bien formado )
Recuperación de
Borrar un carcater extraño
ërrores
6nsertar un carácter que falta
(fase léxica)
Reemplazar un carácter incorrecto por uno
correcto
6ntercambiar dos caracteres adyacentes
  Õ
Õ


Manejo de ërrores §intácticos


Los errores donde la cadena de componentes léxicos violan las reglas
de estructura (sintaxis) del lenguaje son determinados por la fase de
análisis sintáctico.
Aunque los errores sean tan frecuentes, pocos lenguajes han sido
diseñados teniendo en cuenta el manejo de errores. La mayoría de las
especificaciones de los lenguajes de programación no describen cómo
debe responder un compilador a los errores; la respuesta se deja al
diseñador del compilador.
Los programas pueden contener errores de muy diversos tipos
(léxicos, sintácticos, semánticos, lógicos)
  Õ
Õ

Gran parte de la detección y recuperación de errores en un compilaor se
centra en la fase de Análisis §intáctico
Muchos errores son de naturaleza sintáctica o se manifiestan cuando la
cadena de componentes léxicos que proviene de analizador léxico
desobedece las reglas gramaticales que definen al lenguaje de
programación.
La precisión de los métodos modernos de análisis sintácticos, que
pueden detectar la presencia de errores dentro de los programas de una
forma muy eficiente.

Objetivos del Manejador de ërrores en una analizador sintáctico


Debe informar de la presencia de errores con claridad y exactitud.
§e debe recuperar de cada error con la suficiente rapidez como para
detectar errores posteriores.
No debe retrasar de manera significativa el procesamiento de
programas correctos.
  Õ
Õ


Manejo de ërrores §emánticos


Durante el análisis semántico el compilador intenta detectar
construcciones que tengan la estructura sintáctica correcta pero que no
tengan significado para la operación implicada, por ejemplo, si se intenta
sumar dos identificadores, uno de los cuales es el nombre de una matriz, y
el otro, el nombre de un procedimiento.

La detección exacta de la presencia de errores semánticos y lógicos en


el momento de la compilación es mucho más difícil.
  Õ
Õ


¿›ómo debe informar un manejador de errores


de la presencia de un error?
‡ Lugar del programa fuente donde se encontró el error.
‡ 6mprimir la línea errónea con un apuntador a la posición donde se
detecta el error.
‡ 6ncluir un mensaje de diagnóstico informativo y comprensible.
  Õ
Õ


Una vez detectado el error, ¿cómo se debe


Recuperar el analizador sintáctico?
‡ No es adecuado que el analizador sintáctico abandone la compílación
después de detectar el primer error.
‡ Normalmente, el analizador sintáctico intenta volver él mismo a un
estado en el que el procesamiento de la entrada puede continuar con una
esperanza razonable de que se hará el análisis de la entrada correcta o de
que será manejada correctamente por el compilador.
‡ Algunos compiladores intentan reparar los errores, proceso en el cual
el compilador intenta adivinar lo que pretendía escribir el programador.
De hecho, por la importancia creciente de la informática interactiva y los
buenos entornos de programación, la tendencia parece ser hacia
mecanismos sencillos de recuperación de errores.
  Õ
Õ

ëstrategias de Recuperación de ërrores

Recuperación en modo pánico

Método más sencillo de


implantar. Recuperación a nivel de frase
§e borran caracteres
Al descubrir un error, el
sucesivos de la entrada
analizador sintáctico puede
restante hasta que el
realizar una corrección local
analizador léxico pueda
de la entrada restante; es
encontrar un componente
decir, puede sustituir un
léxico bien formado.
prefijo de la entrada restante
por alguna cadena que
permita continuar al
analizador sintáctico.
  Õ
Õ

...ëstrategias de Recuperación de ërrores

Producciones de error
›orreción global
§i se tiene una buena idea
6dealmente, sería deseable que
de los errores comunes que
un compilador hiciera el mínimo
pueden encontrarse, se puede
de cambios posibles al procesar
aumentar la gramática del
una cadena de entrada
lenguaje con producciones que
incorrecta. ëxisten algoritmos
generen las construcciones
para elegir una secuencia mínima
erróneas. ëntonces se usa
de cambios para obtener una
esta gramática aumentada con
corrección global de menor
las producciones de error para
costo; por desgracia, la
construir el analizador
implantación de estos métodos
sintáctico.
es en general demasiado
costosa en términos de tiempo y
espacio.
  Õ
Õ

§ímbolos de ërror
ël compilador, al detectar un error, maneja símbolos de error en la
|abla de ërrores para manejar dichos errores.
Al agregar estos símbolos de error, se indica el número de línea en que
se localiza el error, el tipo de error que corresponde, las localidades de
memoria que afecta, etc.
Un buen compilador maneja el error, el símbolo de error que lo
identifica y su posterior recuperación de manera casi inmediata.

|abla de ërrores
ël compilador utiliza el Manejador de errores para la detección y
recuperación de los mismos, implementando una |abla de ërrores.
ël módulo de ërrores administra la emisión de informes de error, que
es muy primitivo: al encontrar un error de sintaxis, el compilador imprime un
mensaje informando de un error en la línea en curso y después se detiene.
„  


Vous aimerez peut-être aussi