You are on page 1of 5

PONTIFICIA UNIVERSIDAD CATLICA DEL ECUADOR SEDE IBARRA

ESCUELA DE INGENIERIA CARRERA SISTEMAS NOMBRE: IVAN BOLAOS NIVEL: QUINTO

Qu es el analizador sintctico?
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una gramtica dada. Y en caso de que el programa de entrada sea vlido, suministra el rbol sintctico que lo reconoce.

El papel del analizador sintctico


En este modelo de compilador, el analizador sintctico obtiene una cadena de componentes lxicos del analizador lxico, y comprueba si la cadena puede ser generada por la gramtica del lenguaje fuente. Los mtodos empleados generalmente en los compiladores se clasifican como descendentes o ascendentes. Como sus nombres indican, los analizadores sintcticos descendentes construyen rboles de anlisis sintctico desde arriba (la raz) hasta abajo (las hojas), mientras que los analizadores sintcticos ascendentes comienzan en las hojas y suben hacia la raz. En ambos casos, se examina la entrada al analizador sintctico de izquierda a derecha, un smbolo a la vez. Los rboles sintcticos se construyen con un conjunto de reglas conocidas como gramtica, y que definen con total precisin el lenguaje fuente. Al proceso de reconocer la estructura del lenguaje fuente se le conoce con el nombre de anlisis sintctico. Hay distintas clases de analizadores o reconocedores sintcticos, en general se clasifican en dos grandes grupos: analizadores sintcticos ascendentes y analizadores sintcticos descendentes.

rbol sintctico

Anlisis sintctico descendente


Los analizadores sintcticos descendentes construyen el rbol sintctico a partir del smbolo inicial de la gramtica, hasta llegar a los distintos tokens, que constituyen la sentencia a analizar. Es decir, se parte del smbolo inicial de la gramtica y se van aplicando las distintas producciones hasta llegar a formar la sentencia. En el ejemplo de la figura 1, el rbol sintctico se obtiene a partir de las reglas de derivacin de <expresin> hasta llegar a la expresin. El orden de derivacin es importante, siempre se deriva primero el no terminal situado ms a la izquierda segn se mira el rbol (derivaciones ms a la izquierda).

Los principales problemas que se plantean en el anlisis sintctico descendente son dos: el retroceso (en ingls backtracking) y la recursividad a izquierdas.

El retroceso, se produce cuando se eligen mal las producciones para alcanzar la sentencia a analizar, y debe de darse marcha atrs en el proceso de anlisis, para elegir otra alternativa. El retroceso se repite hasta que se ha elegido la alternativa correcta; evidentemente esto ralentiza enormemente el proceso de anlisis. La recursividad a izquierdas, se deriva de que en general se elige el criterio de tomar siempre en primera opcin la alternativa ms a la izquierda. Si en la gramtica existen producciones de la forma: entonces el analizador sintctico se introduce en un bucle infinito, del que no puede salir. A continuacin se muestra la traza de un analizador sintctico recursivo y que da lugar al rbol sintctico. Puede observarse como el analizador sigue el rbol sintctico de la raz a las hojas, eligiendo siempre la primera alternativa por la izquierda. El analizador lxico va leyendo los tokens y envindoselos al analizador sintctico. En el caso de que el token recibido no concuerde con el que contiene la regla, se devuelve al analizador lxico (caso de las derivaciones a <vacio>).

ANALISIS SINTACTICO: <EXPRESION> ANALISIS SINTACTICO: <TERMINO> ANALISIS SINTACTICO: <FACTOR> ANALIZADOR LEXICO: Lee el token ( ANALISIS SINTACTICO: <EXPRESION> ANALISIS SINTACTICO: <TERMINO> ANALISIS SINTACTICO: <FACTOR> ANALIZADOR LEXICO: Lee el token a ANALIZADOR LEXICO: Recibe en buffer el token a ANALISIS SINTACTICO: <VARIABLE> ANALIZADOR LEXICO: Lee el token a ANALISIS SINTACTICO: <MAS_FACTORES> ANALIZADOR LEXICO: Lee el token + ANALIZADOR LEXICO: Recibe en buffer el token +

ANALISIS SINTACTICO: <MAS_TERMINOS> ANALIZADOR LEXICO: Lee el token + ANALISIS SINTACTICO: <TERMINO> ANALISIS SINTACTICO: <FACTOR> ANALIZADOR LEXICO: Lee el token b ANALIZADOR LEXICO: Recibe en buffer el token b ANALISIS SINTACTICO: <VARIABLE> ANALIZADOR LEXICO: Lee el token b

Anlisis sintctico ascendente


Los analizadores sintcticos ascendentes construyen el rbol sintctico a partir de las hojas, paso a paso hasta llegar a la raz. Es decir parten de los distintos tokens de la sentencia a analizar, y por medio de reducciones llegan al smbolo inicial de la gramtica. Se llaman reducciones, para indicar que se efectan en sentido contrario a las producciones de la gramtica. El principal problema que se plantea en el anlisis ascendente es el del retroceso, que se traduce en la eleccin de un pivote para realizar la reduccin. Para salvar este inconveniente se definieron distintos tipos de gramticas entre las cuales las ms utilizadas son las LR(k). Los analizadores sintcticos ascendentes que reconocen lenguajes descritos por gramticas LR(k), toman sus decisiones en funcin de los k tokens inspeccionados por delante (lookaheads) de cada vez en la cadena de entrada, tomados de izquierda a derecha (Left to right), realizndose el anlisis por derivaciones ms a la derecha en sentido inverso (Rightmost). Las gramticas LR(k) describen la mayor parte de los lenguajes libres de contexto, y son mucho menos restrictivas que las gramticas LL(k). Sin embargo la complejidad de los analizadores sintcticos LR(k), hace que la mayor parte de estos se construyan por medio de herramientas software como por ejemplo el yacc incluido en el sistema operativo UNIX.

Tratamientos de errores
Hay dos conceptos fundamentales: Correccin de errores: exige que el programa pueda ejecutarse. Suele utilizarse en sistemas que generan .EXE directamente, pues ahorra tiempo (permite encontrar errores de ejecucin a la vez que los de compilacin). Recuperacin de errores: slo trata de evitar que el nmero de mensajes de error sea demasiado grande y que el compilador/intrprete pueda seguir ejecutndose correctamente en instrucciones sucesivas.

Correccin de errores sintcticos


Si se detecta al analizar la cadena xUy donde x,y en A* y U en A es el prximo smbolo a analizar, podemos intentar lo siguiente: Borrar U e intentarlo de nuevo. 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 anlisis bottom-up). Borrar smbolos del final de x e intentar de nuevo.

No hacer nunca los dos ltimos. Deshace la informacin semntica asociada. Ejemplo: tenemos if (...) { x=0; else ... El error se detecta en "else". Solucin posible: aadir "}" delante de "else", analizando if (...) { x=0; } else ...

You might also like