Analizador sintactico
Upcoming SlideShare
Loading in...5
×
 

Analizador sintactico

on

  • 3,213 views

 

Statistics

Views

Total Views
3,213
Views on SlideShare
3,208
Embed Views
5

Actions

Likes
0
Downloads
57
Comments
0

4 Embeds 5

http://compiladorealexisvilaniez.blogspot.com.br 2
http://compiladorealexisvilaniez.blogspot.com.es 1
http://compiladorealexisvilaniez.blogspot.com.ar 1
http://compiladorealexisvilaniez.blogspot.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Analizador sintactico Analizador sintactico Document Transcript

    • PONTIFICIA UNIVERSIDAD CATOLICA DEL ECUADORSEDE IBARRANombre: Alexis VilañezFecha: 03/05/13Materia: CompiladoresANALIZADOR SINTACTICOEl papel del analizador sintáctico:El análisis sintáctico convierte el texto de entrada en otras estructuras (comúnmente árboles), queson más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada. Unanalizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los queson procesados por el analizador sintáctico para construir la estructura de datos, por ejemplo unárbol de análisis o árboles de sintaxis abstracta.El análisis sintáctico también es un estado inicial del análisis de frases de lenguaje natural. Esusado para generar diagramas de lenguajes que usan flexión gramatical, como los idiomasromances o el latín. Los lenguajes habitualmente reconocidos por los analizadores sintácticos sonlos lenguajes libres de contexto. Cabe notar que existe una justificación formal que establece quelos lenguajes libres de contexto son aquellos reconocibles por un autómata de pila, de modo quetodo analizador sintáctico que reconozca un lenguaje libre de contexto es equivalente encapacidad computacional a un autómata de pila.Los analizadores sintácticos fueron extensivamente estudiados durante los años 70 del siglo XX,detectándose numerosos patrones de funcionamiento en ellos, cosa que permitió la creación deprogramas generadores de analizadores sintáticos a partir de una especificación de la sintaxis dellenguaje en forma Backus-Naur por ejemplo, tales como yacc, GNU bison y javaCC.Análisis sintáctico ascendente y descendenteLa tarea esencial de un analizador es determinar si una determinada entrada puede serderivada desde el símbolo inicial, usando las reglas de una gramática formal, y como haceresto, existen esencialmente dos formas:
    • Analizador sintáctico descendente (Top-Down-Parser): ..un analizador puede empezar con elsímbolo inicial e intentar transformarlo en la entrada, intuitivamente esto sería ir dividiendo laentrada progresivamente en partes cada vez más pequeñas, de esta forma funcionan losanalizadores LL, un ejemplo es el javaCC.Analizador sintáctico ascendente (Bottom-Up-Parser): un analizador puede empezar con laentrada e intentar llegar hasta el símbolo inicial, intuitivamente el analizador intentaencontrar los símbolos más pequeños y progresivamente construir la jerarquía de símboloshasta el inicial, los analizadores LR funcionan así y un ejemplo es el Yacc.Otros tipos de analizadores son:Analizador sintáctico descendente recursivoChart parserLeft corner parserAnalizador sintáctico LRDe la forma de construir el árbol sintáctico se desprenden dos tipos o clases deanalizadores sintácticos. Pueden ser descendentes o ascendente• Descendentes : Parten del axioma inicial, y van efectuando derivaciones a izquierda hastaobtener la secuencia de derivaciones que reconoce a la sentencia.Pueden ser:Con retroceso.Con recursión.LL(1)• Ascendentes: Parten de la sentencia de entrada, y van aplicando reglas de producciónhacia atrás (desde el consecuente hasta el antecedente), hasta llegar al axioma inicial.Pueden ser:Con retroceso.LR(1)Análisis semántico y tratamiento de erroresSi un compilador tuviera que procesar sólo programas correctos, su diseño e implantaciónse simplificarían mucho. Pero los programadores a menudo escriben programasincorrectos, y un buen compilador debería ayudar al programador a identificar y localizarerrores. Es más, considerar desde el principio el manejo de errores puede simplificar laestructura de un compilador y mejorar su respuesta a los errores.Los errores en la programación pueden ser de los siguientes tipos:• Léxicos, producidos al escribir mal un identificador, una palabra clave o unoperador.• Sintácticos, por una expresión aritmética o paréntesis no equilibrados.• Semánticos, como un operador aplicado a un operando incompatible.• Lógicos, puede ser una llamada infinitamente recursiva.El manejo de errores de sintaxis es el más complicado desde el punto de vista de la
    • creación de compiladores. Nos interesa que cuando el compilador encuentre un error, serecupere y siga buscando errores. Por lo tanto el manejador de errores de un analizadorsintáctico debe tener como objetivos:• Indicar los errores de forma clara y precisa. Aclarar el tipo de error y sulocalización.• Recuperarse del error, para poder seguir examinando la entrada.• No ralentizar significativamente la compilación.Un buen compilador debe hacerse siempre teniendo también en mente los errores que sepueden producir; con ello se consigue:• Simplificar la estructura del compilador.• Mejorar la respuesta ante los errores.Tenemos varias estrategias para corregir errores, una vez detectados:• Ignorar el problema (Panic mode ): Consiste en ignorar el resto de la entradahasta llegar a una condición de seguridad. Una condición tal se produce cuandonos encontramos un token especial (por ejemplo un ‘;’ o un ‘END’).A partir deeste punto se sigue analizando normalmente.Ejemplo:aux = a[i]a[i] = a[j];a[j] = aux;Errorid ‘=’ id ‘*‘ id ‘+’ id ’*‘ id ‘+’ ’=’ id ’*‘ id ‘+’ ‘;’ id ’*‘ id ‘+’ ‘=’ id ‘;’Token especial, seguimoscompilando a partir de él• Recuperación a nivel de frase: Intenta recuperar el error una vez descubierto. Enel caso anterior, por ejemplo, podría haber sido lo suficientemente inteligentecomo para insertar el token ‘;’ . Hay que tener cuidado con este método, puespuede dar lugar a recuperaciones infinitas.• Reglas de producción adicionales para el control de errores: La gramática sepuede aumentar con las reglas que reconocen los errores más comunes. En el casoanterior, se podría haber puesto algo como:sent_errónea Ú sent_sin_acabar sentencia_acabada ’;’sentencia_acabada Ú sentencia ‘;’sent_sin_acabar Ú sentenciaLo cual nos da mayor control en ciertas circunstancias• Corrección Global : Dada una secuencia completa de tokens a ser reconocida, sihay algún error por el que no se puede reconocer, consiste en encontrar lasecuencia completa más parecida que sí se pueda reconocer. Es decir, elanalizador sintáctico le pide toda la secuencia de tokens al léxico, y lo que hacees devolver lo más parecido a la cadena de entrada pero sin errores, así como elárbol que lo reconoce.
    • Árboles SintácticosEs una representación que se utiliza para describir el proceso de derivación de dichasentencia.Como nodos internos del árbol, se sitúan los elementos no terminales de las reglas deproducción que vayamos aplicando, y tantos hijos como símbolos existan en la partederecha de dichas reglas.Veamos un ejemplo: Sea la gramática anterior.E Ú E + T | TT Ú T * F | FF Ú ( E ) | a | bSupongamos que hay que reconocer: ( a + b ) * a + bSi el árbol puede construirse, es que la sentencia es correcta:Ambigüedad: Una gramática es ambigua si derivando de forma diferente con el mismotipo de derivación se llega al mismo resultado.Ejemplo: Considérese la gramáticaE E + EE E * EE ( E )E id | numsi tenemos aux + cont + i<ID><+><ID><+><ID>