Next: 1.1.2 El análisis no
Up: 1.1 El análisis incremental
Previous: 1.1 El análisis incremental
En el proceso tradicional, tras analizar la salida generada por el compilador (que puede estar constituida por
un conjunto de listados con los errores encontrados y sus referencias al texto
fuente), si efectivamente éste ha detectado errores, será necesario
repetir el ciclo edición-compilación, lo que conllevará que el texto fuente sea reanalizado
completamente, aunque el error tan sólo afecte a una pequeña porción del
programa. Ciertos compiladores no proporcionan un listado de todos los errores
encontrados sino que paran el proceso de compilación al encontrar el primer
error. El usuario debe entonces modificar el texto y recompilar el programa.
En este punto no nos interesa si el compilador es llamado
desde la línea de comandos o si por el contrario dispone de un entorno de
programación que permite ralizar la compilación directamente desde un
editor. Lo que realmente interesa resaltar aquí es que cada vez que se invoca
al compilador, todo el texto fuente es reanalizado completamente.
Inmediatamente se puede pensar que reconstruir totalmente el árbol de análisis
sintáctico constituye un derroche cuando la corrección del error tan sólo provocará la
modificación de una rama de dicho árbol. De acuerdo con esto, lo ideal sería
que tan sólo se reconstruyesen (o mejor dicho, se reanalizasen)
aquellas ramas afectadas por el error. Sin embargo, para conseguir esto que
aparentemente es tan sencillo se deben dar una serie de condiciones como son:
- El analizador sintáctico debe efectivamente construir una representación
completa del árbol de análisis sintáctico, que debe estar disponible
para el siguiente análisis.
- El analizador sintáctico debe conocer exactamente qué componentes léxicos han sido
modificados por el usuario desde el último análisis.
- Debe de existir un entorno de compilación que mantenga el texto, el árbol
de análisis sintáctico y las relaciones existentes
entre ambos. Esto es, un editor interactivo.
El cumplimiento de estas condiciones implica una modificación
sustancial del análisis sintáctico clásico, ya que:
- Los analizadores sintácticos más comúnmente usados en la actualidad,
no mantienen una representación completa de las
estructuras de cálculo utilizadas en el análisis
sintáctico, sino que suelen utilizar una pila o stack
en la que se van almacenando valores que representan el avance del
proceso de análisis en un momento dado. El movimiento entre estados
del autómata asociado al analizador provoca la localización de nuevos
elementos, o su eliminación, de la pila. Generalmente la realización
de desplazamientos conlleva la introducción de más elementos en la pila
mientras que las reducciones implican la eliminación de la pila de un
cierto número
n de elementos a partir del tope. Dicho número n suele estar
relacionado con la longitud de la parte derecha de la regla. De este
modo se consigue un reconocedor muy eficiente tanto en tamaño como
en velocidad, pero al finalizar el proceso de análisis se carece de
una representación completa del árbol.
- Para que en un análisis incremental de un texto previamente analizado
el analizador pueda saber qué parte del árbol debe ser reconstruida,
éste debe
poseer algún conocimiento sobre las modificaciones que se han realizado
sobre el texto fuente y cómo han afectado a los componentes léxicos. Para
conseguirlo es necesario integrar el analizador léxico con el texto
de modo que el editor sea capaz de establecer las conexiones
componente léxico-texto y pueda guiar al usuario en las operaciones de modificación,
al mismo tiempo que debe ser capaz de indicar al analizador sintáctico
qué porciones del análisis anterior han de ser revisadas. Es en este
trabajo de integración y de construcción del entorno común
parser-lexical-usuario
en lo que se centra la mayor parte de este proyecto
En el procesamiento del lenguaje natural el uso de analizadores incrementales
presenta más ventajas incluso que en el campo de los compiladores de lenguajes
de programación, ya que permiten que ante una entrada errónea (una falta de
ortografía, un error al realizar el OCR de un documento digitalizado mediante
un escáner, etc.) sólo se tenga que reanalizar como mucho la frase en la cual
está contenido el error. En este contexto, sería prohibitivo que para subsanar
un error se tuviese que realizar un nuevo análisis completo de todo el texto de
entrada.
Next: 1.1.2 El análisis no
Up: 1.1 El análisis incremental
Previous: 1.1 El análisis incremental
Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997