La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Compiladores e intérpretes

Presentaciones similares


Presentación del tema: "Compiladores e intérpretes"— Transcripción de la presentación:

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

2 Análisis Sintáctico V Parsers Bottom Up gramática de operadores
Implementación Conflictos Presedencia de operador

3 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, gramática de operadores Para una pequeña clase de gramáticas se puede construir con facilidad, eficientes analizadores por desplazamiento y reducción. Definición: gramática de operadores debe cumplir No tiene reglas de producción A::= No tiene dos no terminales adyacentes A::= BC donde A,B,C Ejemplo,considere las siguientes gramáticas: E::= EAE|(E)|-E|id E::= E+E|E-E|E*E|E/E| (E)|-E|id A::= +|- |* | / No es G. de operadores Es G. de operadores Forma sentencial Pivote Ejemplo,reduzca la cadena id + id *id: id + id *id id E + id *id id E + E *id id E + E *E E*E E + E E+E E

4 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Implementación Usando stack Hay dos problemas que deben ser resueltos si se quiere implementar para esta gramática un analizador de desplazamiento y reducción usando pivotes: Ubicar el subcadena que debe ser reducido por un no terminal. Determinar que producción escoger en caso de que más de una producción tenga ese subcadena en el lado derecho. Estructuras de datos necesarias: Usar un stack para mantener los símbolos de la gramática y un buffer con la cadena de tokens w a ser analizada. Al igual que en el análisis descendente se usa el símbolo $, para marcar el final del stack, y el final de la cadena. Inicialización: STACK ENTRADA $ w$ El analizador opera desplazando cero o más símbolos de entrada al stack hasta que un pivote se forma en el tope del stack. El analizador, reduce por el no terminal correspondiente (lado izquierdo de la producción)

5 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Implementación Usando stack Se repite el ciclo anterior hasta que se detecte un error o hasta que el stack contenga el símbolo inicial y la entrada vacía. Resumiendo, las acciones son: Desplazamiento Reducción Acceptar Error Ejemplo,analice la cadena id + id *id usando técnica desplazamiento reducción Pila Entrada Acción id + id *id $ $ Desplazamiento Reducción E::=id Reducción E::=E*E Reducción E::=E+E Acceptar + id *id $ id *id $ *id $ id $ $ $ id $E $E+ $E+id $E+E $E+E* $E+E*id $E+E*E

6 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Conflictos Usando stack Existen gramáticas libres de conexto, para las cuales el análisis de desplazamiento reducción no se puede realizar. Estos conflictos suceden cuando, al analizar tales gramáticas, se alcanza una configuración en la cualel parser, conociendo el contenido del stack y el próximo símbolo de entrada: no puede decidir ya sea por la acción de desplazamiento o reducción (conflicto dsplazamiento/reducción) no puede decidir cuál entre varias reducciones hacer (conflicto reducción /reducción) Estas gramáticas no son de tipo LR(k). Serán vistas más adelante. Ejemplo,una gramática ambigua no puede ser nunca LR. Considere: sent::= IF expr THEN sent ELSE sent | IF expr THEN sent | otro

7 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Conflictos Usando stack Suponga la siguiente configuración cuando se está haciendo un análisis: STACK ENTRADA $ IF expr THEN sent else $ No se puede saber si if..then.. Es un pivote, no importa lo que haya en el stack. Este es un conflicto shift/reduce Dependiendo de lo que sigue a else en la entrada , corresponderá reducir if..then.. a sent o , desplazar else y buscar completar otra sent para formar el otro pivote if..then..else.. Este conflicto inpide que la gramática sea LR. Ejemplo: el conflicto que se produce cuando se sabe que se tiene un pivote, pero el contenido del stack y del próximo ímbolo no permiten qué producción usar para reducir. Considere la siguiente gramática (tokens en negrita, sent::= id(lista_param)|expr:=expr lista_param::= lista_param,parametro|parametro parametro::=id expr::= id(expr_list)|id expr_list::= expr_list,expr|expr

8 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Conflictos Usando stack Suponga la siguiente configuración cuando se está haciendo un análisis: STACK ENTRADA $ Id(id ,id) $ Es evidente que el token id en el tope del stack debe ser reducido, pero por qué producción? Se puede elegir parametro (si es un procedimiento) o expr si es un arreglo.

9 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Se requere una gramática con propiedades definidas para una gramática de operadores Como técnica general de análisis sintáctico, presenta una serie de inconvenientes Es difícil de manejar cuando hay componentes léxicos con dos precedencias distintas, como el signo menos (unario o binario) No se puede tener la seguridad de que el analizador acepte el lenguaje deseado. Esto es así puesto que la relación entre la gramática para el lenguaje y el parser mismo es difusa. Sólo una pequeña clase de gramáticas puede usar este analizador por precedencia. Ventajas Simplicidad Se pueden establecer relaciones de precedencia (por ejemplo * mayor precedencia que +) Se aplican con otros analizadores, para la parte que no corresponde a reconocimiento de expresiones con operadores.

10 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador El análisis recorre la entrada de izquierda a derecha y se encuentra en dos posibles estados Esperando un operador Esperando un operando El análisis mantiene dos stacks o pilas Pila de Operadores Pila de Operandos Cuando un operador en la cima de su pila es de más prioridad o con más precedencia , que el siguiente de la pila, entonces, el pivote consiste en ese operador junto con los dos operandos situados más arriba en la pila de operandos

11 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Una primera aproximación: Entrada: id + id *id Gramática: E::= E+E|E*E| (E)|id La gramática es ambigua, pero ete tipo de análisis proporciona una sola derivación

12 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Se definen tres relaciones de dependencia entre ciertos partes de terminales, las cuales son disjuntas: a < b si a tiene menos precedencia que b a = b si a tiene igual precedencia que b a > b si a tiene más precedencia que b Algoritmo para derivar usando precedencia de operador: Objetivo: Sustituir todos los símbolos no terminales por un único símbolo Insertar $ al principio y al final de la entarda Insertar las relaciones de precedencia en la cadena de entrada Mientras entrada <> $E$ hacer recorrer entrada de izquierda a derecha hasta encontrar > buscar a la izquierda, saltándose los =, a partir de ese punto , el primer < reducir el pivote que se encuentra en el medio reinsertar las relaciones de precedencia, ignorando los no terminales Fin mientras

13 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Ejemplo: Analice la entrada (id+id) Gramática: E::= E+E|E*E| (E)|id Tabla de precedencia: Análisis Entrada Derivación $< ( < id > + < id >) >$ (id+id) $< ( < E + < id >) >$ (E+id) $< ( < E + E >) >$ (E+E) $< ( < E = ) >$ (E) $ E $ E

14 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Construcción de tabla de precedencia: Si el operador o1 tiene mayor precedencia que o2, entonces hacer op1 > op2 y op2 < op1 Si los operadores op1 y op2 son de igual precedencia (por ejemplo, el mismo operador), entonces hacer: op1 > op2 y op2 > op1, si son asociativos por la izquierda op1 < op2 y op2 < op1, si son asociativos por la derecha Por ejemplo, si + y – tienen la misma precedencia y son asociativos por la izquierda, E-E+E, se derivará primero E-E. Hacer op < id, id > op, op < (, ( < op, ) > op, op > ), op > $, $ < op, para todos los operadores op. Además, sea:

15 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Implementación de un parser con un stack Una vez definida la tabla de precedencia para una gramática de operadores Se debe seguir el siguiente algoritmo guiado sólo por las precedencias, para poder realizar el análisis sintático ascendente: Entrada: Una cadena de entrada w y una tabla de relaciones de precedencia Salida: si la cadena está bien fomada, ok, sino va a rutina de manejo de errores. Inicialización: Insertar $ en el stack y al final de la entrada. Inicio mueva el símbolo de preanálisis al primer token de w$ Repita Siempre si $ está en el tope del stack y preanálisis = $ entonces return ok sino inicio sea a el simbolo tópe del stack y sea b el símbolo apuntado por preanálisis si a < b o a = b entonces inicio push b en stack avance el puntero de preanálisis al próximo símbolo fin sino si a > b entonces repita pop stack hasta el terminal del tope del stack es < que el terminal más recientemente retirado sino error()

16 Compiladores e intérpretes
Análisis sintáctico IV : Análisis ascendente, Presedencia de operador Implementación de un parser de precedencia con un stack Analice la cadena id * (id+id) usando la tabla y la gramática ya definidas, en Gramática y tablas del ejemplo enterior: Pila precedencia Acción Entrada $ menor mayor Mayor Igual id * (id +id) $ * (id +id) $ (id +id) $ id +id) $ +id) $ +id)$ id)$ )$ $ Desplazamiento Reducción Desplazamiento Reducción $ id $ $* $*( $*(id $*(+ $*(+id $*()


Descargar ppt "Compiladores e intérpretes"

Presentaciones similares


Anuncios Google