Analisis lexico

4
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.

Transcript of Analisis lexico

Page 1: Analisis lexico

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.

Page 2: Analisis lexico

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.

Page 3: Analisis lexico

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

Page 4: Analisis lexico

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: