Anda di halaman 1dari 12

PROGRAMACION DE SISTEMAS I UNIDAD IV.

ANALISIS SINTACTICO (Primera parte) Todo lenguaje de programacin tiene reglas que prescriben la estructura sintctica de programas bien formados, p. ej., en Pascal, un programa se compone de bloques, un bloque de proposiciones, una proposicin de expresiones, una expresin de componentes lxicos, y stos de caracteres. Se puede describir la sintaxis de las construcciones de los lenguajes deprogramacin por medio de gramticas independientes de contexto. Las gramticas ofrecen ventajas significativas a los diseadores de lenguajes y a los escritores de compiladores: 1) Una gramtica da una especificacin sintctica y fcil de entender de un lenguaje de programacin. 2) A partir de algunas clases de gramticas se puede construir automticamente un analizador sintctico eficiente que determine si unprograma fuente est sintcticamente bien formado. 3) Otra ventaja es que el analizador sintctico puede revelar ambigedades sintcticas y otras construcciones difciles de analizar que de otro modo podran pasar sin detectar en la fase inicial de diseo de un lenguaje y de su compilador. 4) Una gramtica diseada adecuadamente imparte una estructura a un lenguaje de programacin til para la traduccin de programas fuentes a cdigo objeto correcto y para la deteccin de errores.

5) Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y realizando tareas adicionales. Estas nuevas construcciones se pueden aadir con ms facilidad a un lenguaje cuando existe una aplicacin basada en una descripcin gramatical. El anlisis sintctico obtiene una cadena de componentes lxicos del analizador lxico y comprueba si la cadena puede ser generada por la gramtica del lenguaje fuente, se supone que el analizador sintctico informar de cualquier error de sintaxis de manera inteligible. Tambin debera recuperarse de los errores que ocurren frecuentemente para poder..
Todo lenguaje de programacin tiene reglas que prescriben la estructura sintctica de programas bien formados, p. ej., en Pascal, un programa se compone de bloques, un bloque de proposiciones, una proposicin de expresiones, una expresin de componentes lxicos, y stos de caracteres. Se puede describir la sintaxis de las construcciones de los lenguajes de programacin por medio de gramticas independientes de contexto. Las gramticas ofrecen ventajas significativas a los diseadores de lenguajes y a los escritores de compiladores: 1) Una gramtica da una especificacin sintctica y fcil de entender de un lenguaje de programacin. 2) A partir de algunas clases de gramticas se puede construir automticamente un analizador sintctico eficiente que determine si un programa fuente est sintcticamente bien formado. 3) Otra ventaja es que el analizador sintctico puede revelar ambigedades sintcticas y otras construcciones difciles de analizar que de otro modo podran pasar sin detectar en la fase inicial de diseo de un lenguaje y de su compilador. 4) Una gramtica diseada adecuadamente imparte una estructura a un lenguaje de programacin til para la traduccin de programas fuentes a cdigo objeto correcto y para la deteccin de errores.

5) Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y realizando tareas adicionales. Estas nuevas construcciones se pueden aadir con ms facilidad a un lenguaje cuando existe una aplicacin basada en una descripcin gramatical. El anlisis sintctico obtiene una cadena de componentes lxicos del analizador lxico y comprueba si la cadena puede ser generada por la gramtica del lenguaje fuente, se supone que el analizador sintctico informar de cualquier error de sintaxis de manera inteligible. Tambin debera recuperarse de los errores que ocurren frecuentemente para poder continuar procesando el resto de su entrada.

Componente lxico Programa fuente

Analizador lxico

Analizador Obtn sig. token Sintctico Tabla de Smbolos

rbol de anlisis sintctico

Resto de la etapa inicial

Representacin intermedia

Los mtodos empleados generalmente en los compiladores se clasifican como ascendentes y descendentes. Los analizadores sintcticos descendentes construyen rboles desde la raz hasta las hojas, mientras que los analizadores sintcticos ascendentes comienzan en las hojas y suben hacia la raz. En ambos casos examina la entrada al analizador sintctico de izquierda a derecha, uno a la vez. Los mtodos ascendente y descendente ms eficientes trabajan slo con subclases de gramticas, pero varias de estas subclases, como las gramticas LL y LR, son lo suficientemente expresivas para describir la mayora de las construcciones sintcticas de los lenguajes de programacin.

NOTA: Se asume que la salida de un analizador sintctico es una representacin del rbol de anlisis sintctico para la cadena de componentes lxicos producida por el analizador lxico.

Manejo de errores sintcticos


Si un compilador tuviera que procesar slo programas correctos, su diseo e implementacin se simplificaran mucho. Pero los programadores a menudo escriben programas incorrectos, y un buen compilador debera ayudar al programador a identificar y localizar errores. La mayora de las especificaciones de los lenguajes de programacin no describen cmo debe responder un compilador a los errores; la respuesta se deja al diseador del compilador. Considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los errores. P. ej., los errores que pueden contener los programas son de diversos tipos: | a) Lxicos: como escribir mal un nmero, un identificador o un operador b) Sintcticos: como una expresin aritmtica con parntesis no equilibrados c) Semnticos: como un operador aplicado a un operando incompatible d) Lgico: como una llamada infinitamente recursiva Gran parte de la deteccin y recuperacin de errores en un compilador se centra en la fase de anlisis sintctico. Una razn es que muchos errores son de naturaleza sintctica o se manifiestan cuando la cadena de componentes lxicos que

proviene del analizador lxico desobedece las reglas gramaticales que definen al lenguaje de programacin. El manejador de errores en un analizador sintctico tiene objetivos fciles de establecer: Debe informar de la presencia de errores con claridad y exactitud Se 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

Estrategias de recuperacin de errores

1. En modo de pnico. Al descubrirse un error, el analizador sintctico desecha


smbolos de la entrada, de uno en uno, hasta que encuentra uno perteneciente a un conjunto designado de componentes lxicos de sincronizacin como delimitadores (punto y coma o pal-res, o end, etc)

2. Recuperacin

a nivel de frase. Al descubrirse un error, el analizador sintctico puede realizar una correccin local de la entrada restante; es decir, puede sustituir un prefijo de la entrada restante por alguna cadena que permita continuar el anlisis sintctico. (como sustituir una como por un punto y coma, eliminar un punto y coma sobrante, o insertar uno que falte)

3. Producciones de error. Si se tiene una buena idea de los errores comunes que
pueden encontrarse, se puede aumentar la gramtica del lenguaje con producciones que generen las construcciones errneas. Se usa entonces esta gramtica aumentada con las producciones de error para construir el analizador sintctico. Si el analizador sintctico usa una produccin de error, se pueden generar diagnsticos de error apropiados para indicar la construccin errnea reconocida en la entrada.

4. Correccin

global. Idealmente, sera deseable que un compilador hiciera el mnimo de cambios posibles al procesar una cadena de entrada incorrecta y obtener una correccin global de menor costo (aunque siempre es demasiado costoso en trminos de espacio y tiempo). Se debe sealar que un programa

correcto ms parecido al original puede no ser lo que el programador tena en mente.

Gramticas de contexto libre


Muchas construcciones de los lenguajes de programacin tienen una estructura inherentemente recursiva que se puede definir mediante gramticas independientes del contexto. P. ej., se puede tener una proposicin condicional definida por una regla como: Si S1 y S2 son proposiciones y E es una expresin, entonces: IF E THEN S1 ELSE S2 es una proposicin Por lo tanto: Proposicin if expresin then proposicin else proposicin Una gramtica de contexto libre es un cudruplo G = ( Vt, Vn, So, P) donde: Vt, Smbolos terminales Vn, Smbolos no terminales So, Smbolo de inicio P, reglas de produccin P. ej. expr expr op expr expr ( expr ) expr - expr expr id

a) smbolos terminales : id, +, -, *, /, (, ) b) smbolos no terminales : expr, op c) Smbolo inicial : expr Un lenguaje que pueda ser generado por una gramtica de contexto libre se dice que es un lenguaje de contexto libre. Para comprender cmo trabajan algunos analizadores sintcticos hay que considerar derivaciones donde tan slo el no terminal de ms a la izquierda de cualquier forma de frase se sustituya a cada paso. Dichas derivaciones se denominan por la izquierda.

Convenciones de notacin para una gramtica: 1) Estos smbolos son terminales: a, b, c, +, -, *, (, ), , , 0, 1, .., 9, id 2) Estos smbolos son no terminales: A, B, C, S, expr, op 3) X, Y, Z representan smbolos gramaticales, es decir terminales o no terminales 4) u, v, w, x, y, z representan cadenas de smbolos terminales 5) las letras griegas , representan cadenas de smbolos gramaticales 6) si A , A 2, A n son todas producciones de A, A 1 2 .. n 7) el lado izquierdo de la primera produccin es el smbolo inicial E E A E (E) E Id A+ / DERIVACIONES Hay varias formas de considerar el proceso mediante el cual una gramtica define un lenguaje. La idea central es que se considera una produccin como una regla de reescritura, donde el no terminal de la izquierda es sustituido por la cadena del lado derecho de la produccin: E E + E E * E (E) E Id Por lo que, E == > E E == > (E) (E deriva E derivacin de E a partir de E)

rboles de anlisis sintctico y derivaciones: Un rbol de anlisis sintctico se puede considerar como una representacin grfica de una derivacin que no muestra la eleccin relativa al orden de sustitucin:

Escritura de una gramtica Las gramticas son capaces de describir la mayora, pero no todas, las sintaxis de los lenguajes de programacin: Un analizador lxico efecta una cantidad limitada del analizador sintctico conforme produce la secuencia de componentes lxicos a partir de los caracteres de la entrada. Ciertas limitaciones de la entrada, como el requisito de que los id se declaren antes de ser utilizados, no pueden describirse mediante una gramtica regular. Por lo tanto, las secuencias de componentes lxicos aceptados por un analizador sintctico forman un subconjunto de un lenguaje de programacin; las fases posteriores deben analizar la salida del analizador sintctico para garantizar la obediencia a reglas que el analizador sintctico no comprueba. Expresiones Regulares VS Gramticas de Contexto Libre Toda construccin que se deba describir mediante una expresin regular, tambin se puede describir mediante una GCL, P. ej.: la expresin regular (a b)*abb describe el mismo lenguaje que la GCL: A0 a A0 b A0 a A1 A1 b A2 A2 b A3

A3 Las expresiones regulares son muy tiles para describir la estructura de las construcciones lxicas como identificadores, constantes, nmeros, pal-res, etc Las GCL, por otra parte, son muy tiles para describir estructuras anidadas, como parntesis equilibrados, concordancia de las pal-res como BEGIN-END, los correspondientes IF-THEN-ELSE, etc. Por lo que estas estructuras anidadas no se pueden describir con expresiones regulares. Comprobacin del lenguaje generado por una gramtica As, un conjunto dado de producciones genera un lenguaje determinado. Las< construcciones problemticas se pueden estudiar escribiendo una gramtica abstracta concisa y estudiando el lenguaje que genera. Una prueba de que una gramtica G genera un lenguaje L tiene 2 partes: se debe demostrar que toda cadena generada por G esta en L, y lo opuesto, que toda cadena de L puede de hecho ser generada por G. Ambigedad Se dice que una gramtica que produce ms de un rbol de anlisis sintctico para alguna cadena es ambigua. Por lo tanto, una gramtica ambigua es la que produce ms de una derivacin por la izquierda o por la derecha para la misma frase (cadena). Para algunos tipos de analizadores sintcticos es preferible que una gramtica no sea ambigua, ya que no se podra determinar de manera exclusiva qu rbol de anlisis sintctico seleccionar para una cadena. Supresin de la ambigedad A veces, una gramtica ambigua se puede rescribir para eliminar la ambigedad. P. eje. Se eliminar la ambigedad de la siguiente gramtica con ELSE ambiguo:

Prop IF exp. THEN prop p. ej.

IF exp. THEN prop ELSE prop

IF E1 THEN S1 ELSE IF E2 THEN S2 ELSE S3

Uso de gramticas ambiguas: Es un teorema que toda gramtica ambigua no es LR, por lo que no est en ninguna de las clases de gramticas estudiadas. Ciertos tipos de gramticas ambiguas son tiles en la especificacin e implantacin del lenguaje. Para construcciones de lenguajes como las expresiones, una gramtica ambigua proporciona una especificacin ms natural y corta que cualquier gramtica no ambigua equivalente. Otro uso de las gramticas ambiguas est en el aislamiento de construcciones sintcticas habituales para la optimizacin en casos especiales. Con una gramtica ambigua se pueden especificar las construcciones de casos especiales aadiendo cuidadosamente nuevas producciones a la gramtica. Se debe insistir en que, aunque las gramticas utilizadas son ambiguas, en todos los casos se especifican reglas para eliminar ambigedades que permiten slo un rbol de anlisis sintctico para cada cadena o frase. De esta manera, la especificacin total del lenguaje sigue siendo no ambigua.

Hay que sealar tambin que las construcciones ambiguas se deben usar raramente y de una manera estrictamente controlada, de lo contrario, no se puede conocer con seguridad el lenguaje que reconoce el analizador.

METODOS DE ANALISIS SINTACTICO (Segunda parte) METODOS DE ANALISIS SINTACTICO DESCENDENTE Introduccin: 1. predictivo (pg 44-47) 2. recursividad por la izquierda (pg 47-48) 3. factorizacin por la izquierda (pg 182-183) Mtodos: 4. por descenso recursivo (pg 186-187) 5. predictivo (pg 187-190) 6. predictivo no recursivo (pg 190-193) 7. Primero y Siguiente (193-200) METODOS DE ANALISIS SINTACTICO ASCENDENTE

1. por desplazamiento y reduccin (incluye mangos y poda pg 200208) 2. por precedencia de operadores (pg 209-221) 3. LR L: por el examen de la entrada de izq a der (left-toright) R: por construir una derivacin por la derecha (pg 221-227) 4. SLR (pg 227-236) 5. LR cannico (pg 236-242) 6. LALR (pg 242-251)