Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ANALIZADOR SINTCTICO
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. 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. 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.
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. 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. Para evitar la recursividad a izquierdas y el retroceso, las gramticas deben de cumplir unas determinadas propiedades, dando lugar a una clasificacin de las gramticas. Los lenguajes de programacin que se pueden describir mediante uno de estos tipos de gramticas, llamadas LL(k), se pueden analizar en forma descendente sin retroceso, y sin recursividad a izquierdas. Las gramticas LL(k) realizan el anlisis descendente determinista, por medio del reconocimiento de la cadena de entrada de izquierda a derecha (Left to right) y que va tomando las derivaciones ms a
la izquierda (Leftmost) con slo mirar los k tokens situados a continuacin de donde se halla. En general se utilizan las gramticas LL(1) para la descripcin de lenguajes, que slo miran un token. Tambin existe una herramienta denominada Jack para generar analizadores sintcticos descendentes en lenguaje Java, a partir de unas especificaciones gramaticales del estilo de las herramientas clsicas de anlisis sintctico ascendente lex y yacc. Se caracteriza por: Genera cdigo en lenguaje Java. Las especificaciones lxicas, sintcticas y semnticas van en un fichero nico Permite el uso de cualquier carcter Unicode. Realiza anlisis descendente utilizando una gramtica LL(k), donde se puede fijar K, es decir el nmero de tokens que tiene que mirar hacia adelante (lookahead) para determinar la regla de la gramtica que aplica. En el anlisis semntico utiliza tanto atributos sintetizados como heredados.
Tratamiento de errores
Los errores encontrados en las distintas fases de anlisis se envan a un mdulo denominado manejo de errores. En el caso ms sencillo puede ser un subprograma al que se le invoca envindole el cdigo de error, y que se encarga de escribir un mensaje con el error correspondiente, y el nmero de lnea donde se ha producido, as como de cortar el proceso de traduccin. Si se desea construir un tratamiento de errores ms completo, por ejemplo detectando todos los errores del programa fuente, el mdulo se complica dado que los analizadores deben proseguir su trabajo con falta de datos.
RBOLES SINTCTICOS
rbol sintctico, para una oracin compuesta (el nio que me salud me odia) en la que la oracin subordinada es una oracin de relativo. Dada una oracin o construccin compleja esta puede dividirse en constituyentes sintcticos, cada uno de los cuales a su vez podra ser divisible o analizable en otros constituyentes. El conjunto de constituyentes sintcticos admite con la relacin binaria de inclusin (o "ser parte de") es un conjunto parcialmente ordenado. Un rbol sintctico es una representacin de las relaciones jerrquicas entre los constituyentes sintcticos. Ms formalmente, un rbol sintctico es un grafo que representa esta relacin de orden parcial. Cuando en una construccin un constituyente X es parte de un constituyente inmediato de otro constituyente ms grande Y, el rbol sintctico correspondiente tendr una lnea entre el nodo que representa a X y en nodo que representa a Y. Actualmente se acepta que toda lengua admite un anlisis mediante rboles sintcticos binarios. En los rboles grficos los ncleos sintcticos se suelen representar con una letra, por ejemplo X, seguida de un subndice (por ejemplo ), mientras que las estructuras ms complejas se sealan mediante una o dos barras superpuestas o mediante primas (por ejemplo, ) y si se trata de proyecciones mximas de un ncleo mediante la letras S antecediendo a la letra que designa al ncleo (por ejemplo SX).