La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Compiladores e intérpretes Análisis Sintáctico I Profesor: Eridan Otto.

Presentaciones similares


Presentación del tema: "Compiladores e intérpretes Análisis Sintáctico I Profesor: Eridan Otto."— Transcripción de la presentación:

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

2 Análisis Sintáctico I Introducción Tipos de análisis sintáctico

3 Análisis sintáctico I: Introducción Compiladores e intérpretes –Cada lenguaje de programación tiene reglas que determinan la estructura sintáctica que indica la correcta formación de los mismos. –La sintaxis de un lenguaje de programación puede ser descrita por gramáticas libres de contexto o notación BNF (Bakus-Naur Form) –Ventajas de usar gramáticas: –Son especificaciones sintácticas precisas de los lenguajes –Fáciles de comprender –Para algunas clases de gramáticas se puede construir un parser automáticamente –El proceso de construcción de un abalizador sintáctico puede llevar a descubrir ambigüedades –Una gramática bien diseñada, imparte estructura al lenguaje de programación, siendo más fácil generar código y detectar errores. –Los lenguajes evolucionan en el tiempo, una gramática bien definida permite ampliar o modificar más fácilmente el lenguaje y la implementación de su compliador

4 Análisis sintáctico I: Introducción Compiladores e intérpretes –Funciones: –Comprobar que los componentes léxicos entregados por el analizador léxico, cumple con las reglas de la gramática. –Reporte de errores de sintaxis y recuperación de los mismos, de manera que reporte la mayor cantidas posible de errores –Generar el árbol sintáctico par la próxima fase de compilación. Analizador léxico Programa Fuente Analizador sintáctico Tabla de Símbolos Componente léxico Obtener otro Manejo de Errores Arbol sintáctico

5 Análisis sintáctico I: Tipos Compiladores e intérpretes –Tres tipos generales de analizadores sintácticos. –Métodos universales : Cocke-Younger-Kasami y Early –Sirven para cualquier gramática –Son ineficientes para su uso en lenguajes reales –Descendentes (TOP-DOWN) –Construyen el árbol de análisis sintáctico de arriba (No terminal inicial) hacia abajo (terminales), todos los analizadores de este tipo reconocen un subconjunto de gramáticas: –Analizadores descendentes recursivos –Analizadores LL(1) con tabla (PDA determinista) –Ascendentes (BOTTOM-UP) –Construyen el árbol de análisis sintáctico de abajo hacia arriba, tampoco son capaces de reconocer todas las GLC –Analizadores de precedencia de operador –Analizadores LR(1)

6 Análisis sintáctico I: Tipos Compiladores e intérpretes –Tanto para el análisis descendente como para el ascendente: –La entrada se examina de izquierda a derecha, un símbolo cada vez –Se trabaja con subclases de gramática –En general las gramáticas serán LL y LR –LL(K) es subconjunto de LR(k) –En la práctica sólo seutilizan LL(1) y LR(1) –Muchos compiladores se denomina parse diriven, debido a que la fáse sintáctica es muy relevante y va dirigiendo al analizador léxico. –Al igual que con los analizadores léxicos existen herramientas para generar automáticamente analizadores sintácticos como YACC y Bison.

7 Análisis sintáctico I: Tipos Compiladores e intérpretes –Descendente (visión general): –Algoritmo 1.Símbolo inicial de la gramática, debe ubicarse como raiz del árbol de derivación. 2.Hata que sólo hayan símbolos terminales, derivar por la izquierda. –Ejemplo: –Gramática de expresiones: EXPRESION::= EXPRESION * TERMINO| EXPRESION + TERMINO| TERMINO TERMINO ::= Id | Numero –Entrada : Id * Id + Id –Derivación: EXPRESION EXPRESION + TERMINO EXPRESION * TERMINO + TERMINO TERMINO * TERMINO + TERMINO Id * TERMINO + TERMINO Id * Id + TERMINO Id * Id + Id

8 Análisis sintáctico I: Tipos Compiladores e intérpretes –Ascendente (visión general): –Definición:Pivote –Secuencia más larga de símbolos (Terminales y No Terminales) en la parte más izquierda de la entrada que se puede encontrar en la parte derecha de una producción y tal que los símbolos a su derecha son terminales. –Ejemplo para la gramatica de expersiones anterior: –Si la entrada es: EXPRESION * TERMINO + Id –El pivote es: EXPRESION * TERMINO –Algoritmo: 1.Empezar con la cadena de entrada 2.Intentar llegar hasta el símbolo inicial, encontrando en cada paso un pivote y reduciéndolo con el no terminal de la producción correspondiente. –Ejemplo: Id * Id + Id TERMINO * Id + Id EXPRESION * Id + Id EXPRESION * TERMINO + Id EXPRESION + Id EXPRESION + TERMINO EXPRESION

9 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Descendentes –Más de una opción : A::= con el mismo terminal o secuencia de terminales como primeros símbolo de cada producción –Esto implica que el analizador debe poder retroceder (Backtracking) –Analizar varios elementos de la entrada hacia delante. –Recursividad izquierda –Eliminación de la recursividad –Ambigüedad –Factorización por la izquierda –Ascendentes: –Más de una opción: A::= y es el pivote –Otros: –Problemas semánticos

10 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Recursividad Izquierda en un paso, caso una producción simple: –Se produce cuando una producción tiene la forma: A::= A | Se resuelve transformando la producción o regla de derivación original en dos reglas: A::= Ejemplo: Considere la gramática de expresiones siguiente y elimine su recursividad izquierda: E ::= E+T|T T ::= T *F|F F ::= (E) | Id, aplicando la regla anterior la gramática queda: E::= TE E::= +TE| T ::= FT T::= *FT| F ::= (E) | Id

11 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Recursividad Izquierda en un paso, caso múltiples producciones –Se produce cuando una producción tiene la forma: A::= Se resuelve transformando la producción o regla de derivación original en dos reglas: A::= Ejemplo: Considere la gramática de expresiones siguiente y elimine su recursividad izquierda: EXPRESION::= EXPRESION * TERMINO | EXPRESION + TERMINO| TERMINO aplicando la regla anterior, las producciones quedan: EXPRESION::= TERMINO A A ::= * TERMINO A| + TERMINOA|

12 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Una gramática es recursiva por la izquierda si tiene un no terminal tal que exista una derivación A para alguna cadena –Ejemplo: S ::=Aa | b A ::=Ac |Sd| El no terminal S es recursivo en más de un paso: S -> Aa -> Sda El siguiente algoritmo elimina sistemáticamente la recursividad izquierda de una gramática: 1.Disponer de los símbolos no términales en algún orden 2.For i:=1 to n For j:=1 to i-1 - Reemplazar cada producción por donde son todas las producciones de - Eliminar recursividad izquierda de las Este algoritmo está asegurado cuando en la gramática no existen ciclos (derivaciones que llevan exactamente al mismo no terminal) ni producciones

13 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Para el ejemplo, la producción epsilon no afecta el resultado. Se ordena S, A. Para i=1 no sucede nada y tampoco hay recursividad izquierda en las producciones de S. Para i = 2, se sustituyen las producciones de S (j=1) en A::=Sd obteniendo A ::=Ac | Aad |bd| Eliminando la recursividad inmediata: S ::= Aa | b A::= bdA|A A:= cA|adA|

14 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Factorización por la izquierda –La idea básica, es que cuando no está claro cuál, entre dos producciones alternativas usar para expandir un no terminal A, se deben re escribir las producciones de A para diferir la decisión hasta que el analizador haya procesado suficiente entrada como para hacer la elección correcta. –Ejemplo: sent::= IF expr THEN sent ELSE sent | IF expr THEN sent | REPEAT sent UNTIL expr | REPEAT sent FOREVER –Algoritmo, deja gramática factorizada por la izquierda: –Para cada noterminal A, encuentre el prefijo común a dos o más alternativas de la forma donde representa todas las alternativas que no comienzan con, por: Aquí A es un nuevo no terminal. Aplicar repetidamente esta transformación hasta que no existan dos alternativas para un no terminal con el mismo prefijo.

15 Análisis sintáctico I: Problemas del AS Compiladores e intérpretes –Para el ejemplo, se deben corregir los IF THEN y REPEAT. Aplicando el algoritmo las producciones quedan: sent::= IF expr THEN sentA1 | REPEAT sentA2 A1::=ELSE sent | A2::=UNTIL expr| FOREVER


Descargar ppt "Compiladores e intérpretes Análisis Sintáctico I Profesor: Eridan Otto."

Presentaciones similares


Anuncios Google