Post on 30-Jul-2015
PONTIFICIA UNIVERSIDAD CATÓLICA DEL
ECUADOR SEDE IBARRA
1
JORGE BEJARANO
ESCUELA DE INGENIERÍA
CARRERA DE SISTEMAS
03/05/2013
EL PAPEL DEL ANALIZADOR SINTÁCTICO
En este modelo de compilador, el analizador sintáctico obtiene una cadena de
componentes léxicos del analizador léxico, y comprueba si la cadena puede ser
generada por la gramática del lenguaje fuente. Se supone que el analizador
sintáctico informará de cualquier error de sintaxis de manera inteligible. También
debería recuperarse de los errores que ocurren frecuentemente para poder
continuar procesando el resto de su entrada.
Los métodos empleados generalmente en los compiladores se clasifican como
descendentes o ascendentes. Como sus nombres indican, los analizadores
sintácticos descendentes construyen árboles de análisis sintáctico desde arriba (la
raíz) hasta abajo (las hojas), mientras que los analizadores sintácticos ascendentes
comienzan en las hojas y suben hacia la raíz. En ambos casos, se examina la entrada
al analizador sintáctico de izquierda a derecha, un símbolo a la vez.
ANALIZADOR SINTÁCTICO ASCENDENTE Y
DESCENDENTE
ANÁLISIS SINTÁCTICO DESCENDENTE
En éste analizador las entradas son de izquierda a derecha, y construcciones de
derivaciones por la izquierda de una sentencia o enunciado.
CARÁCTERISTICAS
El análisis sintáctico descendente (ASD) intenta encontrar entre las producciones
de la gramática la derivación por la izquierda del símbolo inicial para una cadena de
entrada.
Parte del axioma de la gramática.
Procesa la entrada de izquierda a derecha.
Escoge reglas gramaticales.
2
ANÁLISIS SINTÁCTICO ASCENDENTE
El objetivo de un análisis ascendente consiste en construir el árbol sintáctico
desde abajo hacia arriba, esto es, desde los tokens hacia el axioma inicial, lo cual
disminuye el número de reglas mal aplicadas con respecto al caso descendente (si
hablamos del caso con retroceso) o amplía el número de gramáticas susceptibles de
ser analizadas (si hablamos del caso LL (1)).
TRATAMIENTO DE ERRORES
Corrección de errores: exige que el programa pueda ejecutarse. Suele utilizarse en
sistemas que generan .EXE directamente, pues ahorra tiempo (permite encontrar
errores de ejecución a la vez que los de compilación).
Recuperación de errores: sólo trata de evitar que el número de mensajes de error
sea demasiado grande y que el compilador/intérprete pueda seguir ejecutándose
correctamente en instrucciones sucesivas.
Corrección ortográfica
Errores ortográficos típicos:
Un carácter por otro.
Un carácter perdido.
Un carácter añadido.
Dos caracteres intercambiados.
Pueden comprobarse sólo los errores anteriores, lo que acelera el proceso.
Corrección de errores sintácticos
Si se detecta al analizar la cadena
xUy
Donde x,y en A* y U en A es el próximo símbolo a analizar, podemos intentar lo
siguiente:
Borrar U e intentarlo de nuevo.
3
Insertar una cadena de terminales z entre x, U y empezar a analizar a
partir de z.
Insertar una cadena de terminales z entre x, U y empezar a analizar a
partir de U, poniendo z en la pila (si es análisis bottom-up).
Borrar símbolos del final de x e intentar de nuevo.
No hacer nunca los dos últimos. Deshace la información semántica asociada.
Recuperación de errores de compilación
Conviene tener una sola rutina de recuperación de errores separada del resto del
compilador.
Evitar que un solo error produzca varios mensajes.
Ejemplo: A[i1,i2,...,i3], donde A no es un "array". Al abrir el corchete nos dará un
error: "A no es un array". Al cerrar el corchete podría dar otro: "El número de
índices no coincide con el rango de A". Si se ha dado el primero, el segundo es
innecesario. Una solución: detectado el primer error, se sustituye la referencia a A
por una referencia a un identificador "fantasma". La rutina de recuperación de
errores podría ignorar los mensajes que se refieren al identificador fantasma.
Recuperación de errores en un intérprete
Hay que señalar el error y detener la ejecución, permitiendo al programador
Revisar las variables
Revisar el código
Modificar el código
Reanudar la ejecución
Saltarse líneas
Abandonar la ejecución del último programa
Abandonar totalmente la ejecución
Y asegurarse de que todo sigue correctamente. En lenguaje simbólico se puede
manipular la pila de ejecución, salir automáticamente de rutinas pendientes, sin
continuar la ejecución, etc.
ÁRBOLES SINTÁCTICOS
4
Árbol sintáctico, para una oración compuesta (el niño que me saludó me odia) en la
que la oración subordinada es una oración de relativo. Dada una oración o construcción compleja esta puede dividirse en constituyentes
sintácticos, cada uno de los cuales a su vez podría ser divisible o analizable en
otros constituyentes. El conjunto de constituyentes sintácticos admite con la
relación binaria de inclusión (o "ser parte de") es un conjunto parcialmente
ordenado. Un árbol sintáctico es una representación de las relaciones jerárquicas
entre los constituyentes sintácticos. Más formalmente, un árbol sintáctico es una
grafo que representa esta relación de orden parcial.
Cuando en una construcción un constituyente X es parte de un constituyente
inmediato de otro constitiyente más grande Y, el árbol sintáctico correspondiente
tendrá una línea entre el nodo que representa a X y en nodo que representa a Y.
Actualmente se acepta que toda lengua admite una análisis mediante árboles
sintácticos binarios. En los árboles gráficos los núcleos sintácticos se suelen
representar con una letra, por ejemplo X, seguida de un subíndice (por ejemplo ),
mientras que las estructuras más complejas se señalan mediante una o dos barras
superpuestas o mediante primas (por ejemplo, ) y si se trata de proyecciones
máximas de un núcleo mediante la letras S antecediendo a la letra que designa al
núcleo (por ejemplo SX).
EJEMPLO: