La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Compiladores e intérpretes Análisis Sintáctico III

Presentaciones similares


Presentación del tema: "Compiladores e intérpretes Análisis Sintáctico III"— Transcripción de la presentación:

1 Compiladores e intérpretes Análisis Sintáctico III
Profesor: Eridan Otto

2 Análisis Sintáctico IV
Parser Predictivo no recursivo Ambiguedad Recuperación de errores Parsers Bottom Up

3 Compiladores e intérpretes
Análisis sintáctico IV : Ambiguedad Ejercicio, dada la siguiente gramática construya su tabla de análisis predictivo, para la gramática siguiente. Detecta usted algún problema: sent::= IF expr THEN sentA1 | REPEAT sentA2|a A1::=ELSE sent | A2::=UNTIL expr| FOREVER expr::=b Pruebe con REPEAT a UNTIL b e IF e THEN REPEAT a FOREVER ELSE a Primer paso, determinar el conjunto de PRIMEROS: PRIMERO(sent)={IF,REPEAT,a} PRIMERO(A1)={ELSE, } PRIMERO(A2)={UNTIL,FOREVER} PRIMERO(expr)={b} Segundo Paso, determinar los conjuntos SIGUIENTE SIGUIENTE(sent)={$,ELSE,UNTIL,FOREVER} SIGUIENTE(A1)={$,ELSE,UNTIL,FOREVER}

4 Compiladores e intérpretes
Análisis sintáctico IV : Ambiguedad SIGUIENTE(A2)={$,ELSE,UNTIL,FOREVER} SIGUIENTE(expr)={$,ELSE,UNTIL,FOREVER,THEN} Tercer Paso, construir la tabla: IF THEN ELSE REPEAT UNTIL FOREVER a b $ Sent A1 A2 expr IF expr THEN sentA1 REPEAT sentA2 a ELSE sent UNTIL expr FOREVER b Aquí surge un problema de ambigüedad en la gramática que se manifiesta en dos elecciones de producción a usar cuando se encuentre A1 y ELSE. La gramática no es LL(1). Aún así se puede tomar la decisión de dejar una producción. ELSE sent.

5 Compiladores e intérpretes
Análisis sintáctico IV : Ambiguedad Analizando REPEAT a UNTIL b Pila Entrada Producción $Sent REPEAT a UNTIL b$ REPEAT sentA2 $A2sentREPEAT REPEAT a UNTIL b$ $A2sent a UNTIL b$ a $A2a a UNTIL b$ $A2 UNTIL b$ UNTIL expr $ expr UNTIL UNTIL b$ b $ expr b$ $ b b$ $ $ Analizando IF e THEN REPEAT a FOREVER ELSE a Ejercicio...

6 Compiladores e intérpretes
Análisis sintáctico IV : Recuperación de errores Un error se puede producir cuando: Símbolo terminal en el tope del stack, no coincide con el símbolo de preanálisis. Cuando se presenta un noterminal A en el tope del stack, con un símbolo a en el preanálisis, al ir a la tabla M[A,a] es vacío o error. La idea de recuperación de errores en modo pánicoestá basada en sacar símbolos de la entrada hasta que un token de un conjunto de tokens sincronizador aparezca. La efectividad de la recuperación dependerá de la elección del conjunto de sincronización. Idealmente, este conjunto debiera ser elegido de manera que el parser se recupere de errores probables de ocurrir en la práctica.

7 Compiladores e intérpretes
Análisis sintáctico IV : Recuperación de errores Algunas heurísticas Como primera regla si no coincide un noterminal A del stack con un token, analizar si el próximo token está en el PRIMERO(A), si es así,saltar el símbolo que no coincide. Si no se da el primer caso, usar este método más general que consiste en asociar en la tabla, la entrada sync, de sincronización a todos los símbolos en SIGUIENTE(A). Luego si se da el problema antes citado, saltar los tokens hasa que aparezca uno en el SIGUENTE(A), luego hacer pop de A del stack. Probablemente el análisis pueda continuar. Si un terminal en el tope del stack, una idea simple es pop del terminal y tratar de continuar. Implementación de la recuperación. A parte de los símbolos sync, pueden asociarse an la tabla punteros a rutinas de manejo de error que lleven acabo estas heurísticas, cambiando, insertando o borrando símbolos y enviando los mensajes de error correspondientes. Puede hacer pop del stack. Cuidar de no caer en loops, evitar agregar símbolos al stack.

8 Compiladores e intérpretes
Análisis sintáctico IV : Recuperación de errores Ejemplo, para la gramatica de expresiones: SIGUIENTE(E)={$,)} SIGUIENTE(T)={$,+,)} SIGUIENTE(F)={$,*,+,)} SIGUIENTE(E’)={$, ) } SIGUIENTE(T’)={$,+,) } Lo que produce una tabla:

9 Compiladores e intérpretes
Análisis sintáctico IV : Recuperación de errores Usando la tabla anterior analice la entrada: )id*+id Pila Entrada Acción de recuperación $E )id*+id$ Error, Revisa Id est á en FIRST(E), salta ) $E id*+id $ id*+id $ $E’T id*+id $ $E’T’F id*+id $ $E’T’id *+id $ $E’T’ *+id $ $E’T’F* +id $ Error, synch en tabla, POP $E’T’F +id $ $E’T’ +id $ $E’ +id $ $E’T+ id $ $E’T id $ $E’T’F id $ $E’T’id $ $E’T’ $ $E’ $ $

10 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente Análisis por desplazamiento y reducción Simple de stack Por precedencia de operadores LR(1), (método mucho más general) Este tipo de parser construte un árbol sintáctico, para una cadena de entrada que comienza por las hojas y avanza hacia la raiz. Equivalente a reducir una cadena de tokens de entrada w al símbolo inicial de la gramática. En cada paso de reducción se sustituye una subcadena que concuerde con el lado derecho de una producción por el símbolo del lado izquierdo. Se traza una derivación por la derecha en el sentido inverso. Ejemplo: S::= aABe Análizando sintaxis : abbcde A::=Abc|b aBbcde B::=d aAde aABe S


Descargar ppt "Compiladores e intérpretes Análisis Sintáctico III"

Presentaciones similares


Anuncios Google