Gramáticas y parsers LR(K)

Documentos relacionados
Analizadores sintácticos LR(0) y SLR

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

LR(1) - LALR. Alejandro Grinberg. 30 de Octubre de (agradecimiento a Juan Manuel Pérez) Alejandro Grinberg () LR(1) - LALR 1 / 16

Compiladores: Parsing ascendente

Tema 5. Análisis sintáctico ascendente

Analizador Sintáctico Ascendente

22, 23 y 24 Análisis sintáctico V Compiladores - Profr. Edgardo Adrián Franco Martínez

Procesadores de Lenguaje

Proyecto Intermedio Algoritmo de Earley

Agenda. Introducción Analizador léxico Analysis El problema de analizar sintácticamente Analizador sintáctico descendeterecursivo

ANÁLISIS SINTÁCTICO II LR1

Procesadores de Lenguaje

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 4

ANÁLISIS SINTÁCTICO II SLR

Lenguajes y Compiladores Análisis Sintáctico Parte II

Tema: Análisis Sintáctico LR

Análisis sintáctico 1

Procesadores de Lenguaje

Universidad Nacional del Santa Facultad de Ingeniería E.A.P. de Ingeniería de Sistemas e Informática TEORIA DE COMPILADORES ANALISIS SINTACTICO

Procesadores de Lenguaje

Tema 4: Análisis sintáctico ascendente. Análisis sintáctico ascendente: un ejemplo

El análisis descendente LL(1) 6, 7 y 13 de abril de 2011

ANÁLISIS SINTÁCTICO II LALR

4 o Ingeniería Informática

ANÁLISIS SINTÁCTICO I ANALIZADORES SINTÁCTICOS

Tema: Análisis Sintáctico LR

Controla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion

Gramáticas tipo 0 o Estructura de frase En este tipo de gramáticas no hay restricción en su producciones y tienen la forma siguiente.

Compiladores. Análisis Sintáctico Ascendente. Adrian Ulises Mercado Martínez. Facultad de Ingeniería, UNAM. 5 de septiembre de 2013

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

Generación de analizador sintáctico ascendente Yacc (bison,... ) Generación de analizador sintáctico ascendente v1.1 c 2005 José Fortes Gálvez p.

17 Análisis sintáctico II Compiladores - Profr. Edgardo Adrián Franco Martínez. Gramáticas limpias y bien formadas

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

Capítulo 4: Algoritmos usados por el Generador de Analizadores Sintácticos

Ciencias de la Computación I

Análisis sintáctico Analizadores ascendentes

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

18 Análisis sintáctico III Compiladores - Profr. Edgardo Adrián Franco Martínez. Clasificación de métodos de análisis sintáctico Análisis descendente

B b A. Notar que las gramáticas utilizadas son sin recursión por la izquierda:

YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator

ANÁLISIS SINTÁCTICO PREDICTIVO NO RECURSIVO

La Ambigüedad en el Parsing

Más sobre gramáticas independientes de contexto o incontextuales

Introducción a la Lógica y la Computación

Tipos de análisis deterministas. Análisis descendente. Tipos de análisis deterministas. Análisis ascendente. Análisis descendente

Compiladores: Sesión 16. Análisis semántico, traducción dirigida por sintaxis

Procesadores de lenguaje Tema Análisis sintáctico (Parte II)

ANÁLISIS SINTÁCTICO I ANÁLISIS SINTÁCTICO DESCENDENTE LL(1)

Procesadores de Lenguajes. Análisis sintáctico. Analizadores descendentes

Compiladores e Intérpretes Análisis Sintáctico

16 Análisis sintáctico I

1. Acciones en Yacc. %{ #include <stdio.h> yyerror (char *s) { fprintf (stderr, %s\n, s) ; } %} %% : S \n {printf ( Correcto\n );} ; : ( S ) S

Las Gramáticas LL. Gramáticas con Parsing Eficiente. Universidad de Cantabria

Temas. Objetivo. Analizador Sintáctico: funciones y tipos. Analizador Sintáctico Descendente. Analizador Sintáctico Ascendente

Tres versiones de Pal. Sesión 19. Una máquina para aceptar Pal El lenguaje: Tabla de transición para Pal. Más de un siguiente estado.

Unidad IV Análisis Sintáctico. M.C. Juan Carlos Olivares Rojas

Teoría de Autómatas y Lenguajes Formales Práctica 4

Procesadores de lenguaje

Eliminación de Símbolos Inútiles

Compiladores e Intérpretes Análisis Léxico

Tres versiones de Pal. Tema 19. Una máquina para aceptar Pal. Tabla de transición para Pal. Transición. Más de un siguiente estado

Las Etapas de la Compilación

INAOE. Gramáticas Libres de Contexto. Definición formal de CFGs. Derivaciones usando. Derivaciones. izquierda y. derecha.

Análisis sintáctico Analizadores descendentes

Análisis Sintáctico. Esquema general de un analizador sintáctico. Texto. Árbol de Análisis Sintáctico o FALLO. + Analizador Sintáctico Gramática

Gramáticas libres de contexto

ANÁLISIS SINTÁCTICO. Comprobar que la secuencia de componentes léxicos cumple las reglas de la gramática Generar el árbol sintáctico

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes.

Generalidades sobre lenguajes.

Lección 5: Análisis Sintáctico LR

Procesadores de lenguaje

ANÁLISIS SINTÁCTICO I CONJUNTOS PRIMERO Y SIGUIENTE

Uso de la herramienta YACC

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

Autómata de Pila (AP, PDA) Sesión 18

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

NOTAS PARA LA MATERIA LENGUAJES DE PROGRAMACIÓN

Lenguajes y Compiladores Análisis Léxico

UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO

Computabilidad y Lenguajes Formales: Teoría de la Computabilidad: Reducibilidad

Tema 6: Compiladores e intérpretes. Teoría de autómatas y lenguajes formales I

Conceptos básicos sobre gramáticas

Autómata de Pila (AP, PDA) Tema 18

Agenda. BNF y EBNF Brevemente, lo necesario para especificar el lenguaje sobre el que vamos a trabajar.

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Ciencias de la Computación I

TRADUCTORES E INTERPRETADORES

GRAMÁTICAS LIBRES DE CONTEXTO

GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 3.

Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55

Complejidad Computacional

Máquinas Secuenciales, Autómatas y Lenguajes. Tema 4: Expresiones Regulares. Luis Peña

Tema 3. Introducción al análisis sintáctico

Transcripción:

Gramáticas y parsers LR(K)» Son (al igual que los LL) una familia de parsers para analizar gramáticas libres de contexto. Se caracterizan por:» Son analizados sintácticos ascendentes.» Leen entrada de izq. a der. (L = left-to-right)» para encontrar y producir una derivación más a la derecha de dicha cadena (R = rightmost derivation)» K corresponde a la cantidad de símbolos de lookahead.

» Pizarrón Ejemplo

Gramáticas y parsers LR(K)» Vamos a ver varios tipos de parsers LR:» LR(0) - SLR(1) - LALR(1) - LR(1)» Forma general de los algoritmos LR(K) incluye:» stack» tablas de parseo» operaciones básicas:» aceptar/rechazar» shift» reduce

Modelo de un analizador sintáctico LR» Pizarrón

Algunas definiciones» Handle: (informalmente) subcadena de una forma sentencial, que coincide con el lado derecho de una producción y cuya reducción representa un paso en una derivación a derecha, en reversa.» Prefijos viables: prefijos de una forma sentencial derecha que no sobrepasan el handle ubicado más a la derecha.

Pasos de un algoritmo LR» Paso 1: construir el AFD del lenguaje con el conjunto de prefijos viables.» Paso 2: a partir de éste calcular las tablas de acciones para decidir si hacer un shift o un reduce» (o detectar conflictos que indiquen que la gramática NO es LR).» Hacer todo lo que dijimos antes ir leyendo la entrada, apilando y reduciendo según indique la tabla hasta terminar.

Lo que vamos a ver hoy Resumen de la construcción de un parser LR(0) Limitaciones de los lenguajes LR(0) Construcción de un parser engine SLR(1) Limitaciones de los lenguajes SLR(1) Oscar Bonilla 2 Universidad Galileo

Item LR(0)» (Informalmente) es una producción con un punto en alguna posición del lado derecho.» Para qué me sirve esto?

Items LR(0) Tenemos que capturar cuánto de una producción hemos escaneado hasta ahora <X> ( <X> ) Representado por 4 ítems <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) Oscar Bonilla 3 Universidad Galileo

Ejemplo de ítems La gramática <S> <X> $ <X> ( <X> ) <X> ( ) Items <S> <X> $ <S> <X> $ <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( ) <X> ( ) <X> ( ) Oscar Bonilla 4 Universidad Galileo

Items LR(0)» Los estados del AFD que vamos a armar son conjunto de items.» Cómo utilizaríamos esto en el AFD?

Idea clave de los Items Si el estado actual contiene el ítem A α c β y el símbolo actual en el buffer de entrada es c El estado le dice al parser que ejecute un shift El siguiente estado va a contener A α c β Si el estado contiene el ítem A α El estado le dice al parser que ejecute un reduce Si el estado contiene el ítem S α $ y el buffer de entrada está vacío El estado le dice al parser que ejecute un accept Oscar Bonilla 5 Universidad Galileo

Closure() de un conjunto de ítems Closure encuentra todos los ítems en el mismo estado del AFD Algoritmo para closure(i) Todo ítem en I es también un ítem en closure(i) Si A α B β está en closure(i) y B γ es un ítem, entonces agregamos B γ a closure(i) Repetir hasta que no se puedan agregar más ítems a closure(i) Oscar Bonilla 6 Universidad Galileo

Ejemplo de Closure Encontrar closure(<x> ( <X> ) ) <X> ( <X> ) <X> ( <X> ) <X> ( ) Items <S> <X> $ <S> <X> $ <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( ) <X> ( ) <X> ( ) Oscar Bonilla 7 Universidad Galileo

Goto() de un conjunto de ítems Goto encuentra el nuevo estado después de consumir un símbolo de la gramática mientras estamos en el estado actual Algoritmo para goto(i, X) donde I es un conjunto de ítems y X es un símbolo de la gramática goto(i, X) = closure( { A α X β A α X β en I }) Goto es el nuevo conjunto obtenido al mover el punto sobre X Oscar Bonilla 8 Universidad Galileo

Ejemplo de Goto Encontrar goto(<x> ( <X> ), <X> ) Items <X> ( <X> ) <S> <X> $ <S> <X> $ <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( ) <X> ( ) <X> ( ) Oscar Bonilla 9 Universidad Galileo

Construyendo los estados del AFD Comenzamos con la producción <S > <S> $ El primer estado es closure(<s > <S> $) Elegimos un estado I Para cada A α X β en I encontrar goto(i, X) si goto(i, X) no es ya un estado, creamos uno Agregamos una arista X del estado I al estado goto(i, X) Repetimos hasta que no sea posible agregar nada más Oscar Bonilla 10 Universidad Galileo

Ejemplo de construcción de los estados del AFD s0 <S> <X> $ <X> ( <X> ) <X> ( ) X ( s1 <S> <X> $ s2 <X> ( <X> ) <X> ( ) <X> ( <X> ) <X> ( ) ) s5 <X> ( ) ( X s3 <X> ( <X> ) ) s4 <X> ( <X> ) Oscar Bonilla 11 Universidad Galileo

Creando las tablas de parseo Para cada estado Transición a otro estado usando un símbolo terminal es un shift a ese estado (shift to sn) Transición a otro estado usando un no-terminal es un goto a ese estado (goto sn) Si hay un ítem A α en el estado hacemos una reducción con esa producción para todos los terminales (reduce k) Oscar Bonilla 12 Universidad Galileo

Ejemplo de Construcción de Parse Table ACTION Goto State ( ) $ X s0 shift to s2 error error goto s1 s1 error error accept s2 shift to s2 shift to s5 error goto s3 s3 error shift to s4 error s4 reduce (2) reduce (2) reduce (2) s5 reduce (3) reduce (3) reduce (3) s0 <S> <X> $ <X> ( <X> ) <X> ( ) X ( s1 <S> <X> $ s2 <X> ( <X> ) <X> ( ) <X> ( <X> ) <X> ( ) ) s5 <X> ( ) s3 <X> ( <X> ) Oscar Bonilla 13 Universidad Galileo ( X ) s4 <X> ( <X> )

Construcción de un Parse Engine LR(0) Agregamos la producción especial S S $ Encontramos los ítems Creamos el AFD Usando las funciones closure y goto Construimos la tabla de parseo LR(0) Parser Engine Oscar Bonilla 14 Universidad Galileo

» Pizarrón Seguimiento

Resumen Resumen de la construcción de un parser LR(0) Limitaciones de los lenguajes LR(0) Construcción de un parser engine SLR(1) Limitaciones de los lenguajes SLR(1) Oscar Bonilla 15 Universidad Galileo

Ejemplo Strings de uno o más paréntesis izquierdos seguidos del mismo número de paréntesis derechos <S> <X> $ <X> ( <X> ) <X> ( ) Strings de cero o más paréntesis izquierdos seguidos del mismo número de paréntesis derechos <S> <X> $ <X> ( <X> ) <X> ε Oscar Bonilla 17 Universidad Galileo

Ejemplo La gramática <S> <X> $ <X> ( <X> ) <X> ε Items <S> <X> $ <S> <X> $ <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> ( <X> ) <X> Oscar Bonilla 19 Universidad Galileo

Construcción de la tabla de parseo ACTION Goto State ( ) $ X s0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1 s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3 s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2) s0 <S> <X> $ <X> ( <X> ) <X> Conflicto shift/reduce X ( s1 <S> <X> $ s2 <X> ( <X> ) <X> ( <X> ) <X> Conflicto shift/reduce ( X s3 <X> ( <X> ) ) s4 <X> ( <X> ) Oscar Bonilla 52 Universidad Galileo

Construcción de la tabla de parseo ACTION Goto State ( ) $ X s0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1 s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3 s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2) Cómo nos libramos de estos conflictos shift/reduce? Oscar Bonilla 53 Universidad Galileo

Limitaciones de las gramáticas LR(0) Muchos conflictos shift/reduce Razón Un ítem X α en el estado actual identifica una reducción Pero no selecciona cuándo reducir Por lo tanto, tenemos que efectuar la reducción en todos los símbolos de entrada Oscar Bonilla 54 Universidad Galileo

Resumen Resumen de la construcción de un parser LR(0) Limitaciones de los lenguajes LR(0) Construcción de un parser engine SLR(1) Limitaciones de los lenguajes SLR(1) Oscar Bonilla 55 Universidad Galileo

Idea detrás de las gramáticas SLR(1) Muchos conflictos shift/reduce en LR(0) un item X α en el estado actual identifica una reducción Pero no selecciona cuándo reducir Por lo tanto, tenemos que efectuar la reducción en todos los símbolos de entrada Hacemos la reducción sólo cuando el símbolo de entrada en efecto sigue a la reducción Tenemos que calcular los terminales que pueden seguir un símbolo no-terminal Oscar Bonilla 56 Universidad Galileo

siguientes() Para cada no-terminal A, siguientes(a) es el conjunto de terminales que pueden venir después de A Si hay una secuencia de derivaciones de la forma S α A $ entonces siguientes(a) va a incluir $ Oscar Bonilla 57 Universidad Galileo

Ejemplo de siguientes() Encontrar siguientes(<x>) ), $ gramática <S> <X> $ <X> ( <X> ) <X> ε Oscar Bonilla 62 Universidad Galileo

Pregunta: Encuentren siguientes() Qué es siguientes(<s>) $ gramática <S> <X> $ <X> ( <X> ) <X> ε Oscar Bonilla 64 Universidad Galileo

Construyendo un parser engine SLR(1) Agregamos la producción especial S S $ Calcular el conjunto siguientes para todos los no-terminales Encontrar los ítems Crear el AFD Usando las funciones closure y goto Construir la tabla de parseo Usando el AFD y la información del conjunto siguientes SLR Parser Engine Oscar Bonilla 65 Universidad Galileo

Creando las tablas de parseo Para cada estado La transición a otro estado usando un símbolo terminal es un shift a ese estado (shift to sn) La transición a otro estado usando un símbolo noterminal es un goto a ese estado (goto sn) Si hay un ítem A α en el estado, para todos los terminales c siguientes(a) hacer una reducción con la producción (reduce k) Oscar Bonilla 66 Universidad Galileo

Construyendo la tabla de parseo ACTION Goto State ( ) $ X s0 shift to s2 reduce (3) reduce (3) goto s1 s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3 s3 error shift to s4 error s4 error reduce (2) reduce (2) s0 <S> <X> $ <X> ( <X> ) <X> X siguientes(<x>) = { ), $ } siguientes(<s>) = { $ } ( s1 <S> <X> $ s2 <X> ( <X> ) <X> ( <X> ) <X> s3 <X> ( <X> ) Oscar Bonilla 97 Universidad Galileo ( X ) s4 <X> ( <X> )

Tablas de parseo LR(0) y SLR(1) SLR(1) ACTION Goto State ( ) $ X s0 shift to s2 reduce (3) reduce(3) goto s1 s1 error error accept s2 shift to s2 reduce (3) reduce(3) goto s3 s3 error shift to s4 error s4 error reduce (2) reduce (2) LR(0) ACTION Goto State ( ) $ X s0 shift to s2/reduce (3) reduce (3) reduce(3) goto s1 s1 error error accept s2 shift to s2/reduce (3) reduce (3) reduce(3) goto s3 s3 error shift to s4 error s4 reduce(2) reduce(2) reduce(2) Oscar Bonilla 98 Universidad Galileo

Parser Engine SLR(1) Usamos los ítems Sólo vemos la posición actual Sin conocimiento del input futuro En la reducción Vemos el siguiente input (usando el conjunto siguientes) De acá el 1 de SLR(1) Oscar Bonilla 99 Universidad Galileo

Resumen Resumen de la construcción de un parser LR(0) Limitaciones de los lenguajes LR(0) Construcción de un parser engine SLR(1) Limitaciones de los lenguajes SLR(1) Oscar Bonilla 100 Universidad Galileo

Gramáticas SLR(1) vs LR(1) SLR(1) mantiene la posición actual además de alguna información acerca del siguiente caracter de entrada LR(1) mantiene información completa acerca del siguiente caracter de entrada Oscar Bonilla 101 Universidad Galileo

» Preguntas? Continuará