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 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 Análisis sintáctico I: Introducción 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 Análisis sintáctico I: Introducción 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. Manejo de Errores Programa Fuente Analizador léxico Componente léxico Analizador sintáctico Arbol sintáctico Obtener otro Componente léxico Tabla de Símbolos

5 Análisis sintáctico I: Tipos
Compiladores e intérpretes Análisis sintáctico I: Tipos 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 Análisis sintáctico I: Tipos 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 Análisis sintáctico I: Tipos Descendente (visión general): Algoritmo Símbolo inicial de la gramática, debe ubicarse como raiz del árbol de derivación. 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 Análisis sintáctico I: Tipos 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: Empezar con la cadena de entrada 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 Análisis sintáctico I: Problemas del AS 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 Análisis sintáctico I: Problemas del AS 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::= 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 Análisis sintáctico I: Problemas del AS 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 Análisis sintáctico I: Problemas del AS 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: Disponer de los símbolos no términales en algún orden 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 Análisis sintáctico I: Problemas del AS 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 Análisis sintáctico I: Problemas del AS 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 Análisis sintáctico I: Problemas del AS 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"

Presentaciones similares


Anuncios Google