Sei sulla pagina 1di 14

UNIDAD 6.

-ANLISIS SINTCTICO

6.1 GLC 6.2 rboles de derivacin. 6.3 Formas normales de Chomsky. 6.4 Diagramas de sintaxis 6.5 Eliminacin de la ambigedad. 6.6 Generacin de matriz predictiva ( clculo first y follow) 6.7 Tipos de analizadores sintcticos 6.8 Manejo de errores 6.9 Generadores de analizadores sintcticos

Competencia especfica de la unidad Construir un analizador sintctico a partir de un lenguaje de programacin o un analizador sintctico gramticas (p.e. YACC). para el reconocimiento de

Criterios de evaluacin de la Unidad Mapa conceptual: 20%

Solucin de ejercicios: 40% Desarrollo de programa: 40%

Actividades de aprendizaje Mapa conceptual: Realizar por equipos de trabajo una investigacin y mapa conceptual de los temas: GLC, rboles de derivacin, Formas normales de Chomsky, Notacin de los diagramas de sintaxis Solucin de ejercicios: Identificar la notacin formal de una gramtica. Construir diagramas de sintaxis de un lenguaje. Construir una GLC a partir de los diagramas de sintaxis. Eliminar la ambigedad de una gramtica. Distinguir los Errores sintcticos. Desarrollo de programa: Construir un analizador sintctico (utilizar un generador de analizador sintctico o un LP).

UNIDAD 6 Anlisis Sintctico. 6.1 GLC Capturan la nocin de constituyente sintctico y la nocin de orden. Herramienta formal que puede ser vista tanto desde un punto de vista generador como estructurador. Propiedades computacionales interesantes: se puede reconocer en tiempo polinmico. Una Gramtica Libre de Contexto es una tupla con 4 parmetros: G = (V,T,P,S) V conjunto de smbolos variables T conjunto de smbolos terminales S V, smbolo inicial P conjunto de reglas de produccin: A , con sucesin de smbolos de V T, eventualmente vaca ( = ). Una GLC es un dispositivo generador. Definimos el lenguaje LG generado por una gramtica G del siguiente modo: LG = { w / S * w } , siendo * una especie de clausura transitiva de y w una tira de terminales. Reglas para oraciones aseverativas (esbozo) O GN GV O GV GV V GV V GN GV V GAdj GV V GAdv GV GV GP 6.2 rboles de derivacin. Podemos decir:

Del mismo modo se puede decir deriva en uno o ms pasos.

Una derivacin por la izquierda es aquella en la que se reemplaza el no terminal ms a la izquierda en cada paso de la derivacin. . anlogamente para la derecha Una derivacin por la izquierda corresponde a la numeracin preorden de los nodos internos de su rbol de anlisis gramatical asociado. . derecha . postorden inversa. Toda derivacin de las gramticas de tipo 1, 2 3 se puede representar mediante un rbol. 6.3 Formas normales de Chomsky. Una gramtica formal est en Forma normal de Chomsky si todas sus reglas de produccin son de alguna de las siguientes formas: o o donde , y son smbolos no terminales (o variables) y es un smbolo terminal. Todo lenguaje independiente del contexto que no posee a la cadena vaca, es expresable por medio de una gramtica en forma normal de Chomsky (GFNCH) y recprocamente. Adems, dada una gramtica independiente del contexto, es posible algortmicamente producir una GFNCH equivalente, es decir, que genera el mismo lenguaje. En algunos textos se puede encontrar una definicin de una GFNCH de forma que cualquier GFNCH produzca cualquier lenguaje independiente del contexto y de la misma manera, que para cualquier lenguaje independiente del contexto exista una GFNCH que lo defina. Esta definicin apenas se diferencia en permitir una regla de la siguiente forma: o o donde es gramtica, el es smbolo distinguido (o un smbolo no inicial) de terminal la (o

variable), y tambin son smbolos no terminales pero distintos de , es un smbolo terminal, y es la cadena nula (o vaca).

6.4 Diagramas de sintaxis Un segundo mtodo alternativo para desplegar las producciones de ciertas gramticas de tipo 2 es el diagrama de sintaxis. sta es una imagen de las producciones que permite al usuario ver las sustituciones en forma dinmica, es decir, verlas como un movimiento a travs del diagrama. En la figura 10.5 se ilustrar los diagramas que resultan de la traduccin de conjuntos de producciones tpicos, que son, por lo general, todas las producciones que aparecen en el lado derecho de algn enunciado BNF.

a) <w> ::= <w1> <w2> <w3>

b) <w> ::= <w1><w2> | <w1>a | bc<w2>

c) <w> ::= ab<w>.

d) <w> ::= ab | ab<w>.

6.5 Eliminacin de la ambigedad. Una GLC es ambigua si existe una cadena w L(G) que tiene ms de una derivacin por la izquierda o ms de una derivacin por la derecha o si tiene dos o ms rboles de derivacin. En caso de que toda cadena w L(G) tenga un nico rbol de derivacin, la gramtica no es ambigua. TIPOS DE AMBIGEDAD Dentro del estudio de gramticas existen dos tipos fundamentales de ambigedad, los cuales son:
Ambigedad Inherente:

Las gramticas que presentan este tipo de ambigedad no pueden utilizarse para lenguajes de programacin, ya que por ms transformaciones que se realicen sobre ellas, nunca se podr eliminar completamente la ambigedad que presentan. Un lenguaje L es inherentemente ambiguo si todas sus gramticas son ambiguas; si existe cuando menos una gramtica no ambigua para L, L no es ambiguo. El lenguaje de las expresiones no es Ambiguo Las expresiones regulares no son ambiguas

Ambigedad Transitoria:

Este tipo de ambigedad puede llegar a ser eliminada realizando una serie de transformaciones sobre la gramtica original. Una vez que se logra lo anterior, la gramtica queda lista para ser reconocida por la mayor parte de los analizadores sintcticos. (Se le considera "ambigedad" porque existen mtodos para realizar anlisis sintctico que no aceptan gramticas con estas caractersticas) Dnde se presenta la Ambigedad Transitoria generalmente la ambigedad se presenta cuando existen producciones con factores comunes (distintas alternativas para un smbolo no-terminal que inician de la misma forma); cuando existen producciones que son recursivas izquierdas (producciones para un

smbolo no-terminal en las cuales el primer smbolo de su forma sentencial es ese mismo smbolo no-terminal).
Cmo solucionar el problema de la Ambigedad Transitoria?

Para eliminar este tipo de ambigedad, es necesario, primero eliminar: Factores comunes izquierdos inmediatos y No-inmediatos. Recursividad izquierda inmediata y No-inmediata.

ELIMINACIN DE LA AMBIGEDAD. No existe un algoritmo que nos indique si una GIC es ambigua Existen LIC que slo tienen GIC ambiguas: inherentemente ambiguos Para las construcciones de los lenguajes de programacin comunes existen tcnicas para la eliminacin de la ambigedad

Ejemplo: causas de ambigedad en la siguiente gramtica No se respeta la precedencia de operadores Una secuencia de operadores idnticos puede agruparse desde la izquierda y desde la derecha. Lo convencional es agrupar desde la izquierda. 6.6 Generacin de matriz predictiva (clculo first y follow) FIRST Si es cualquier cadena de smbolos gramaticales, se considera FIRST() como el conjunto de terminales que encabezan las cadenas derivadas de . Si = * => , entonces tambin est en FIRST(). Para calcular FIRST(X) para algn smbolo X de la gramtica, se aplican las siguientes reglas hasta que no se pueda aadir nada nuevo al conjunto FIRST: 1. Si X es terminal, entonces FIRST(X) es {X}. 2. Si X es no terminal y existe la produccin X , entonces aadir a FIRST(X). 3. Si X es no terminal y X Y1 Y2 .. . Yk es una produccin entonces, para todo i (con i variando desde 1 hasta k) tal que Y1 , Y2 , ..., Yi-1 sean todos no terminales y FIRST(Y1), FIRST(Y2), ..., FIRST(Yi-1) contengan todos , se aaden todos los smbolos no nulos de FIRST(Yi ) a FIRST(X). Finalmente, si est en FIRST(Yj ) para j = 1, 2, ..., k (o sea, en todos), entonces se aade a FIRST(X). Dicho de otra forma, lo anterior significa que todos los elementos de FIRST(Y1), excepto , pertenecen tambin a FIRST(X). Si Y1 no deriva , entonces ya ha terminado el clculo de FIRST(X), pero en caso contrario, es decir, si Y1 =*=> ,

entonces todos los elementos de FIRST(Y2) excepto pertenecen tambin a FIRST(X), y as sucesivamente. Finalmente, si todos los Yi derivan , entonces se aade a FIRST(X). FOLLOW Se define FOLLOW(A), para el no terminal A, como el conjunto de terminales a que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial, es decir, el conjunto de terminales a tal que haya una derivacin de la forma S=*=>Aa para algn y . Si A puede ser el smbolo de ms a la derecha en alguna forma sentencial, entonces $ est en FOLLOW(A). Para calcular FOLLOW(A) para un smbolo no terminal A, se aplican las siguientes reglas hasta que no se pueda aadir nada ms al conjunto FOLLOW. 1. $ est en FOLLOW(S), siendo S el axioma de G. 2. Si existe una produccin A B, entonces todo lo que est en FIRST(), excepto , est en FOLLOW(B). 3. Si existe la produccin A B y FIRST() contiene (es decir, =*=>), o bien si existe una produccin A B, entonces todo lo que est en FOLLOW(A) est en FOLLOW(B). 6.7 Tipos de analizadores sintcticos Analizador Descendente: Se construye el rbol de anlisis sintctico partiendo del smbolo inicial y aplicando las producciones mediante derivaciones por la izquierda, el smbolo a expandir es el que este ms a la izquierda. Ejemplo: G=({+,*, ID, (, )}, {E, T, P}, E, P) P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) } Frase ID + ( ID * ID ) Analizador Ascendente: Se construye el rbol de anlisis sintctico partiendo de la frase a reconocer y aplicando las producciones mediante reducciones hasta llegar a smbolo inicial de la gramtica. Ejemplo: G=({+,*, ID, (, )}, {E, T, P}, E, P) P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) } Frase ID + ( ID * ID )

L L

(1) Es Predictivo

Descendentes

Se aplican las producciones por izquierda El orden de lectura de la entrada es de izquierda a derecha S L R (1)

Tipos de Analizadores

Es Predictivo Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha Simple L R (1) Es Predictivo

Ascendentes

Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha LA L R (1) Es Predictivo Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha Look a Head: Al construir el analizador va a tratar de mirar por adelantado el texto para comprenderlo y hacer mas sencillo y mejores estados

6.8 Manejo de errores Rutinas de Manejo de Errores Ocupan gran parte de los compiladores Objetivos Informar con claridad, exactitud Recuperacin rpida recuperacin no es correccin No debe retrasar el procesamiento de programas sin errores No generar errores en cascada (ej. eliminar identificador) Acciones posibles Detectar errores Informar de los errores Recuperar de los errores Corregir errores

Necesidad actual de recuperacin? Ms rpido re-compilar que leer siguiente erro

Tipos de errores Lxicos: escribir mal un identificador, nmero. Sintcticos: no poner un ; al final de una sentencia, estructura incorrecta. Semnticos: multiplicar por una variable booleana Lgicos: bucle infinito Herramientas para disminuir el nmero de errores Lxicos Si se utiliza alguna herramienta que complete palabras Sintcticos Si se utiliza algn editor basado en sintaxis (colores) Semnticos Busca funciones/clases e indica tipos especificados Modo de Pnico Caractersticas Mtodo ms sencillo Lo pueden usar la mayora de los AS No entra en lazos infinitos Adecuado para lenguajes en los que son raros mltiples errores en la misma proposicin

Funcionamiento general El AS desecha smbolos de la entrada, uno por uno, hasta encontrar un token de sincronizacin para continuar Delimitadores (punto y coma, palabras clave como end) Inconvenientes Podran omitirse gran cantidad de smbolos sin analizar

A nivel de frase Caractersticas Correcciones en la cadena de entrada

Funcionamiento Descubierto el error se corrige (localmente) la entrada por un prefijo que permite continuar el AS Sustituir una coma por un punto y coma, insertar un punto y coma, etc.

Inconvenientes

Dificultad para resolver situaciones en las que el error se produjo antes de la deteccin de ste Pueden producir lazos infinitos Evitar insertar smbolos antes del smbolo actual en la entrada Producciones de error Funcionamiento Conocidos los errores ms comunes, se extiende la gramtica con producciones de error Reconocido el error, se dan diagnsticos precisos de la construccin errnea Ej.: E->E op T | E->T E-> E T //falta operador T->id | num Inconvenientes Dificultad para ir ms all de los casos particulares ms frecuentes Generacin ambigedades

6.9 Generadores de analizadores sintcticos Hemos visto cmo el anlisis lxico facilita la tarea de reconocer los elementos de un lenguaje uno a uno. A partir de ahora, vamos a centrarnos en el anlisis sintctico, que nos permitir averiguar si un fichero de entrada cualquiera respeta las reglas de una gramtica concreta. Para el tema del anlisis sintctico vamos a utilizar la herramienta yacc (Yet Another Compiler Compiler). Funcionamiento de yacc Igual que suceda con lex, yacc no es directamente un analizador sino un generador de analizadores. A partir de un fichero fuente en yacc, se genera un fichero fuente en C que contiene el analizador sintctico. Sin embargo, un analizador sintctico de yacc no puede funcionar por s solo, sino que necesita un analizador lxico externo para funcionar. Dicho de otra manera, el fuente en C que genera yacc contiene llamadas a una funcin yylex() que debe estar definida y debe devolver el tipo de lexema encontrado. Adems, es necesario incorporar tambin una funcin yyerror(), que ser invocada cuando el analizador sintctico encuentre un smbolo que no encaja en la gramtica.

El lenguaje Yacc
Esquema general

Un programa fuente de Yacc se parece bastante a uno de lex. La diferencia principal est en la seccin de reglas, que en vez de expresiones regulares contiene las reglas de la gramtica:

De estas tres secciones, slo la segunda es obligatoria, y no debe estar vaca (ntese que en lex, las tres secciones pueden estar vacas). Esto quiere decir que el mnimo programa en yacc es: %% regla gramatical accin en C

La seccin de declaraciones puede incluir varias cosas, tal y como ocurra en lex, pero ahora su funcin principal no es definir expresiones regulares, sino declarar los smbolos terminales de la gramtica mediante la directriz

%token. Todo lo que no sea un terminal, ser considerado un smbolo no terminal, y por tanto debe haber una regla para l: %token IF,ELSE,LLAVE_AB,LLAVE_CE,IDENT La seccin de reglas contiene la gramtica en s. Componentes es una combinacin de terminales y no terminales que describe al no terminal de la izquierda de la regla: no_terminal: componentes {acciones en C} La seccin de rutinas tiene la misma funcin que la de lex, pero yacc (dependiendo de su variante) no define por defecto las funciones main(), yylex() e yyerror(), as que hay que incluirlas aqu, o bien en otro fichero que se enlazar en la fase final de la compilacin.

Yacc genera una funcin llamada yyparse() que contiene el analizador sintctico. Esta funcin se comporta como una mquina de estados cuya misin es intentar reducir todo el fichero de entrada al smbolo inicial de la gramtica (el primero que se haya definido). Si yacc lo consigue, el analizador sintctico volver sin error, y en caso contrario, se invocar a la funcin yyerror(), que debe estar definida tambin en algn sitio.

Actividades:
Mapa conceptual: Realizar por equipos de trabajo una investigacin y mapa conceptual de los temas: GLC, rboles de derivacin, Formas normales de Chomsky, Notacin de los diagramas de sintaxis Solucin de ejercicios: los realizaremos en clases . Desarrollo de programa: Construir un analizador sintctico ver lo siguiente

Video https://www.youtube.com/watch?v=uoMlO8JFRxY Archivos del video descargarlos https://docs.google.com/file/d/0B3_b21Tb1us5UzUyUkJYanJUU00/edit

otros de apoyo http://crysol.org/es/node/819 http://elblogdepicodev.blogspot.mx/2011/10/ejemplo-sencillo-conjavacc-de-un.html