Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones.

Slides:



Advertisements
Presentaciones similares
ÁRBOLES DE SINTAXIS ÁRBOL grafo dirigido acíclico.
Advertisements

INSTITUTO TECNOLÓGICO DE MINATITLÁN
Filminas Segunda semana
Compiladores e intérpretes
Analizador Sintáctico
Gramáticas Libres de Contexto
ANALIZADOR SINTACTICO
Unidad 3. Análisis Sintáctico
Traducción dirigida por la Sintaxis
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como.
Tema 2 Lenguajes Formales.
Análisis sintáctico LR: SLR (LR simple)
ANALISIS SINTACTICO Parte I
Compiladores Introducción Oscar Bonilla Universidad Galileo.
Clasificación de Gramáticas y Manejo de Errores
ESTRUCTURA DE DATOS ESD-243
Introducción al Análisis Sintáctico
Programación de Sistemas
Compiladores Análisis Léxico Oscar Bonilla Universidad Galileo.
UNIVERSIDAD LATINA (UNILA)
1 Sebastián Argüello A60490 semana 3 Autómatas y compiladores CI-1322.
Teoría de lenguajes y compiladores
Compiladores Análisis Léxico Oscar Bonilla Universidad Galileo.
Teoría de lenguajes y compiladores
IV. GRAMÁTICAS DISTRIBUIDAS Y TABLAS DE SÍMBOLOS
Programación de Sistemas
República Bolivariana de Venezuela Ministerio del Poder Popular para la Educación Superior Universidad Valle del Momboy Carvajal, Trujillo Alumnas Luzmila.
Liceo de Curridabat Tema: Conceptos básicos de programación. Alumna: Valeria Garita Sánchez. Sección:8-6 Año:2015.
Las tres primeras fases de un compilador suelen agrupan en un sola fase llamada Análisis del programa a compilar y las tres ultimas en una sola fase llamada.
ALGORITMOS Y TIPOS DE DATOS Un algoritmo es un método para resolver un problema. Para la creación de un programa (resolver un problema) en un lenguaje.
¿Qué es un Diagrama de Flujo? UN DIAGRAMA DE FLUJO, TAMBIÉN LLAMADO FLUJOGRAMA DE PROCESOS O DIAGRAMA DE PROCESOS, REPRESENTA LA SECUENCIA O LOS PASOS.
Traducción dirigida por la Sintaxis Teoría de Autómatas y Lenguajes Formales Alma María Pisabarro, 2007.
Análisis Semántico y Chequeo de Tipos. Resumen Introducción Tablas de Símbolos Chequeo Semántico Chequeo de Tipos Semántica de un Programa Orientado a.
Ingreso , proceso y salida de datos
Métodos de compresión sin pérdida de información
“Análisis y Descripción de Lenguajes de Programación”
Diagramas de Flujo Algoritmos.
ALGORITMOS Por Carolina R.
UNIVERSIDAD ICEP INTELIGENCIA ARTIFICIAL INGENIERÍA EN SISTEMAS COMPUTACIONALES Martes, 24 de Octubre de 2017 REPRESENTACIÓN DEL CONOCIMIENTO Y RAZONAMIENTO.
CREAR DIAGRAMA DE FLUJO
Constantes y variables
Lenguaje y representación técnica
LÓGICA DE PROGRAMACIÓN
ALGORITMOS es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos.
Universidad Nacional de Loja
Tema 7. Introducción a lenguaje de programación Visual Basic (clase 1)
Algoritmo Capitulo Cinco.
CONCEPTOS PRELIMINARES (Cont)
Programación III Catedrático: Ing. Pablo Antonio de León Bautista. Código: (2014) Pre-Requisito: Post-Requisito:
GRAMATICA LIBRE DE CONTEXTO LENGUAJE LIBRE DE CONTEXTO Marcela Hernandez.
Diagrama de Flujo La presentación gráfica de sistemas es una forma ampliamente utilizada como herramienta de análisis, ya que permite identificar aspectos.
HERRAMIENTAS DE PROGRAMACIÓN
Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones.
ÁRBOLES ESTRUCTURA DE DATOS II ING. CARLOS ALBERTO PULLAS.
Criterios Evaluación Portafolio de evidencias 5 Mapa conceptual 10 Practicas 30 Examen teórico 20 Analizador Sem. 35.
Testing basado en sintaxis: Introducción
Funciones del Analizador Sintáctico
Instituto Tecnológico de Minatitlán
FUNDAMENTOS DE PROGRAMACIÓN. INTRODUCCIÓN  Conceptos: Informática, Ordenador, Programa, Dato, Bit, Byte, Hardware, Software, Lenguaje de Programación,
LENGUAJES DE PROGRAMACIÓN c o m p i l a d o r e s
Informática Aplicada al Medio Ambiente - Curso 99/00 1 Tema 6. Introducción a la programación 1 Conceptos básicos 2 Los algoritmos – Concepto de algoritmo.
Estructura general de un programa. Estructura general de un programa. Pseudocódigo Diagrama de flujo Concepto de programas. Concepto de programas. Instrucciones.
Informática Aplicada al Medio Ambiente - Curso 99/00 1 Tema 6. Introducción a la programación 1 Conceptos básicos 2 Los algoritmos – Concepto de algoritmo.
Recursividad 1 Análisis de algoritmos. Matrushka La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más.
Tema 7. Introducción a lenguaje de programación Visual Basic (clase 1)
Tema 2 Estructura de un programa en C. IWI Tema 2 Programa en C U n programa en C es una serie de instrucciones en un lenguaje muy especifico (similar.
Informática Aplicada al Medio Ambiente - Curso 99/00 1 Tema 6. Introducción a la programación 1 Conceptos básicos 2 Los algoritmos – Concepto de algoritmo.
UNIDAD 1 Análisis semántico 1.1 ARBOLES DE EXPRESIONES.
COMPILADORES Semana 1 Ing. Jorge Vigil Farfán MgTI, PMP, ITIL-Expert, Cloud, ISO 27002, CCNP, CCNA, CCNA Sec, NSE.
Capítulo 6 El significado.
Transcripción de la presentación:

Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones

Oscar Bonilla 2Universidad Galileo Resumen Overview del análisis léxico Qué es análisis sintáctico Gramáticas libres de contexto Derivaciones y árboles de parseo Top-down vs. Bottom-up Parsing Grámaticas Ambiguas Implementando un Parser

Oscar Bonilla 3Universidad Galileo Anatomia de un Compilador Optimizador Generador de Código Representación Intermedia Optimizada Código en Assembler Generador de Código Intermedio Representación Intermedia Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream)

Oscar Bonilla 4Universidad Galileo Resumen de Análisis Léxico El analizador léxico crea tokens a partir de un character stream Los tokens se definen usando expresiones regulares

Oscar Bonilla 5Universidad Galileo Expresiones Regulares, Gramáticas y Lenguajes Una expresión regular puede ser escrita usando: –Caracteres en el alfabeto –Operadores de expresiones regulares: ‘*’ ‘·’ ‘|’ ‘+’ ‘?’ ‘(‘ ‘)’ –Ejemplo: (-| ε) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)? Un lenguaje regular es un lenguaje definido por una expresión regular

Oscar Bonilla 6Universidad Galileo Expresiones Regulares, Gramáticas y Lenguajes Qué hay acerca de las variables simbólicas? –Ejemplo: num = 0|1|2|3|4|5|6|7|8|9 posint = num · num* int = (ε | -) · posint real = int · (ε | (. · posint)) Sólo son una abreviación, llamada “syntactic sugar” –Ejemplo: (-| ε) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?

Oscar Bonilla 7Universidad Galileo Resumen de Análisis Léxico El analizador léxico crea tokens a partir de un character stream Los tokens se definen usando expresiones regulares Las expresiones regulares pueden mapearse a un Automaton Finito No Determinístico (NFA) –Por construcción simple NFA se transforma a un DFA –Algoritmo de transformación –Ejecutar un DFA es fácil

Oscar Bonilla 8Universidad Galileo Resumen Overview del análisis léxico Qúe es análisis sintáctico Gramáticas libres de contexto Derivación y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

Oscar Bonilla 9Universidad Galileo Sintaxis y Semántica de un Lenguaje de Programación? Sintaxis –Como se ve un programa –Representación textual o estructura –Es posible una definición matemática precisa Semántica –Cuál es el significado de un programa –Es más difícil dar una definición matemática

Oscar Bonilla 10Universidad Galileo Por qué hacer análisis sintáctico? Podemos proveer una definición precisa y fácil de entender Una gramática apropiada imparte estructura a un lenguaje de programación Podemos construir automáticamente un parser que determine si el programa es sintácticamente correcto Ayuda en el proceso de traducción Fácil modificar/añadir al lenguaje

Oscar Bonilla 11Universidad Galileo Anatomia de un Compilador Optimizador de Código Generador de Código Representación Intermedia Optimizada Código en Assembler Generador de Código Intermedio Representación Intermedia Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream)

Oscar Bonilla 12Universidad Galileo Entrada y Salida de un Parser - ( ) minus_op left_paren_op num(123.3) plus_op num(23.6) right_paren_op Token StreamArbol de Parseo Entrada: - ( ) Analizador Sintáctico (Parser)

Oscar Bonilla 13Universidad Galileo Definición de la Sintaxis Tenemos que proveer una definición precisa y fácil de entender de la sintaxis del lenguaje de programación Podemos usar expresiones regulares? –Podemos usar un lenguaje regular para definir un lenguaje de programación?

Oscar Bonilla 14Universidad Galileo Ejemplo: Scope Jerárquico Procedure foo(integer m, integer n, integer j) { for i = 1 to n do { if (i == j) { j = j + 1; m = i*j; } for k = i to n { m = m + k; }

Oscar Bonilla 15Universidad Galileo Ejemplo: Scope Jerárquico Procedure foo(integer m, integer n, integer j) { for i = 1 to n do { if (i == j) { j = j + 1; m = i*j; } for k = i to n { m = m + k; } Problema de los paréntesis balanceados –Ejemplo: {{}{{{}{{}}}}}

Oscar Bonilla 16Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular?

Oscar Bonilla 17Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular? NO!

Oscar Bonilla 18Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular? NO! Intuición Número de paréntesis abiertos debe ser igual a número de paréntesis cerrados Necesitamos mantener un conteo o necesitamos recursión Además: NFA’s y DFA’s no pueden ejecutar conteo sin límites

Oscar Bonilla 19Universidad Galileo Problema de los paréntesis balanceados Hay alguna gramática que defina esto?  ( ) | ε La definición es recursiva Esta es una gramática libre de contexto –Es más expresiva que las expresiones regulares

Oscar Bonilla 20Universidad Galileo Resumen Overview del análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivación y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

Oscar Bonilla 21Universidad Galileo Definiendo Context-Free Grammars (CFGs) Terminales –Símbolos para strings o tokens No terminales –Variables sintácticas Símbolo de Inicio –Un no-terminal especial es designado Producciones –La forma en que los terminales y no-terminales son combinados para formar strings –Un no-terminal en el lado izquierdo (LHS) y un string de terminales y no-terminales en el lado derecho (RHS)

Oscar Bonilla 22Universidad Galileo Ejemplo de una CFG  ( ) | ε

Oscar Bonilla 23Universidad Galileo Ejemplo de una CFG  ( )  ε

Oscar Bonilla 24Universidad Galileo Ejemplo de una CFG  ( )  ε Terminales

Oscar Bonilla 25Universidad Galileo Ejemplo de una CFG  ( )  ε No-terminales

Oscar Bonilla 26Universidad Galileo Ejemplo de una CFG  ( )  ε Símbolo de Inicio:

Oscar Bonilla 27Universidad Galileo Ejemplo de una CFG  ( )  ε Producciones

Oscar Bonilla 28Universidad Galileo Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto a Expresión RegularGramática libre de contexto  a p · q  Si p y q son expresiones regulares, usando CFGs y p | q  p *   ε

Oscar Bonilla 29Universidad Galileo Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto ???  Si p es una expresión regular, usando una CFG, Qué es? Expresión RegularGramática libre de contexto P? ???

Oscar Bonilla 30Universidad Galileo Entonces por qué usar expresiones regulares? Separar el análisis sintáctico en partes léxica y no- léxica es una buena modularización Las reglas léxicas son simples y pueden ser expresadas usando expresiones regulares Las expresiones regulares son más concisas Las implementaciones de analizadores léxicos para expresiones regulares son más eficientes

Oscar Bonilla 31Universidad Galileo Creando una CFG Tenemos que crear una CFG a partir de las definiciones del lenguaje Hay muchas cosas involucradas –Vamos a ver algunas de ellas en clase Veamos un lenguaje simple

Oscar Bonilla 32Universidad Galileo Ejemplo: Una CFG para expresiones Expresiones aritméticas simples con + y * – – * 45.3 –( ) * (6.035 * -( )) Terminales (o tokens) –num para todos los números –plus_op (‘+’), minus_op (‘-’), times_op(‘*’), left_paren_op(‘(‘), right_paren_op(‘)’) Cuál es la gramática para todas las expresiones posibles?

Oscar Bonilla 33Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  *

Oscar Bonilla 34Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Terminales

Oscar Bonilla 35Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Terminales

Oscar Bonilla 36Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * No-terminales

Oscar Bonilla 37Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * No-terminales

Oscar Bonilla 38Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Símbolo de Inicio:

Oscar Bonilla 39Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Producciones

Oscar Bonilla 40Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  *

Oscar Bonilla 41Universidad Galileo Ejemplo: Una CFG para expresiones  | ( ) | - | num  + | *

Oscar Bonilla 42Universidad Galileo Pregunta: Cuál es el lenguaje definido por esta CFG?  a a | aa

Oscar Bonilla 43Universidad Galileo Resumen Overview de análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

Oscar Bonilla 44Universidad Galileo Derivaciones Cómo mostramos que una secuencia de tokens es aceptada por una CFG? Una producción es usada para derivar una secuencia de tokens a partir del símbolo de inicio Dados los strings ,  y  y una producción A   Un solo paso de la derivación es  A   

Oscar Bonilla 45Universidad Galileo Ejemplo de Derivación Gramática  | ( ) | - | num  + | * Entrada 36 * ( ) Token Stream num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 46Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 47Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 48Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

Oscar Bonilla 49Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

Oscar Bonilla 50Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 51Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 52Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

Oscar Bonilla 53Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

Oscar Bonilla 54Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 55Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 56Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’  *

Oscar Bonilla 57Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  *

Oscar Bonilla 58Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 59Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 60Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  ( )

Oscar Bonilla 61Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  ( )

Oscar Bonilla 62Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 63Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 64Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

Oscar Bonilla 65Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

Oscar Bonilla 66Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 67Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 68Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

Oscar Bonilla 69Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

Oscar Bonilla 70Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 71Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 72Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  +

Oscar Bonilla 73Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  +

Oscar Bonilla 74Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 75Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 76Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

Oscar Bonilla 77Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

Oscar Bonilla 78Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 79Universidad Galileo Arbol de Parseo Representación gráfica de la estructura parseada Muestra la secuencia de derivaciones efectuada –Nodos internos son no-terminales –Hojas son terminales –Cada nodo padre es el lado izquierdo (LHS) y los hijos son el lado derecho (RHS) de una producción

Oscar Bonilla 80Universidad Galileo Ejemplo de Arbol de Parseo

Oscar Bonilla 81Universidad Galileo Ejemplo de Arbol de Parseo 

Oscar Bonilla 82Universidad Galileo Ejemplo de Arbol de Parseo  num num

Oscar Bonilla 83Universidad Galileo Ejemplo de Arbol de Parseo  ‘*’ * num

Oscar Bonilla 84Universidad Galileo Ejemplo de Arbol de Parseo  ‘(‘ ‘)’ ()* num

Oscar Bonilla 85Universidad Galileo Ejemplo de Arbol de Parseo  ()* num

Oscar Bonilla 86Universidad Galileo Ejemplo de Arbol de Parseo  num num ()*

Oscar Bonilla 87Universidad Galileo Ejemplo de Arbol de Parseo  ‘+’ num + ()*

Oscar Bonilla 88Universidad Galileo Ejemplo de Arbol de Parseo  num num + ()*

Oscar Bonilla 89Universidad Galileo Ejemplo de Arbol de Parseo num + ()* num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 90Universidad Galileo Resumen Overview del análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

Oscar Bonilla 91Universidad Galileo Derivaciones left-most vs. right-most Leftmost derivation –En el string, encontramos el no-terminal de más a la izquierda y le aplicamos una producción –El ejemplo anterior fue de una leftmos derivation Rightmost derivation –Encontramos el no-terminal de más a la derecha y le aplicamos una producción

Oscar Bonilla 92Universidad Galileo Ejemplo de Right-Derivation Producción: String:

Oscar Bonilla 93Universidad Galileo Ejemplo de Right-Derivation Producción:  String:

Oscar Bonilla 94Universidad Galileo Ejemplo de Right-Derivation () Producción:  ‘(‘ ‘)’ String: ‘(‘ ‘)’

Oscar Bonilla 95Universidad Galileo Ejemplo de Right-Derivation () Producción:  String: ‘(‘ ‘)’

Oscar Bonilla 96Universidad Galileo Ejemplo de Right-Derivation num () Producción:  num String: ‘(‘ num ‘)’

Oscar Bonilla 97Universidad Galileo Ejemplo de Right-Derivation num + () Producción:  ‘+’ String: ‘(‘ ‘+’ num ‘)’

Oscar Bonilla 98Universidad Galileo Ejemplo de Right-Derivation num + () Producción:  num String: ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 99Universidad Galileo Ejemplo de Right-Derivation num + ()* Producción:  ‘*’ String: ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 100Universidad Galileo Ejemplo de Right-Derivation num + ()* Producción:  num String: num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 101Universidad Galileo Ejemplo de Right-Derivation num + ()* String: num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 102Universidad Galileo Ejemplo de Right-Derivation   ‘(‘ ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘+’ num ‘)’’  ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 103Universidad Galileo Top-down vs. Bottom-up Parsing Normalmente escaneamos de izquierda a derecha Left-most derivation refleja top-down parsing –Comenzamos con el símbolo inicial –Terminamos con el string de tokens

Oscar Bonilla 104Universidad Galileo Top-down Parsing Left-most derivation   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 105Universidad Galileo Top-down vs. Bottom-up Parsing Normalmente escaneamos de izquierda a derecha Left-most derivation refleja top-down parsing –Comenzamos con el símbolo inicial –Terminamos con el string de tokens Right-most derivation refleja bottom-up parsing –Comenzamos con el string de tokens –Terminamos con el símbolo inicial

Oscar Bonilla 106Universidad Galileo Bottom-up Parsing Right-most derivation   ‘(‘ ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘+’ num ‘)’’  ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 107Universidad Galileo Bottom-up Parsing Right-most derivation   ‘(‘ ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘+’ num ‘)’’  ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 108Universidad Galileo Bottom-up Parsing Right-most derivation  num ‘*’ ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  ‘(‘ num ‘+’ num ‘)’  ‘(‘ ‘+’ num ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘)’ 

Oscar Bonilla 109Universidad Galileo Resumen Overview de análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

Oscar Bonilla 110Universidad Galileo Otro Ejemplo Entrada: * 86 Token Stream: num ‘+’ num ‘*’ num

Oscar Bonilla 111Universidad Galileo Otro Ejemplo Producción: String:

Oscar Bonilla 112Universidad Galileo Otro Ejemplo Producción:  String:

Oscar Bonilla 113Universidad Galileo Otro Ejemplo num Producción:  String: num

Oscar Bonilla 114Universidad Galileo Otro Ejemplo + num Producción:  ‘+’ String: num ‘+’

Oscar Bonilla 115Universidad Galileo Otro Ejemplo Producción:  String: num ‘+’ + num

Oscar Bonilla 116Universidad Galileo Otro Ejemplo Producción:  num String: num ‘+’ num num +

Oscar Bonilla 117Universidad Galileo Otro Ejemplo num + Producción:  ‘*’ String: num ‘+’ num ‘*’ *

Oscar Bonilla 118Universidad Galileo Otro Ejemplo num + Producción:  num String: num ‘+’ num ‘*’ num *

Oscar Bonilla 119Universidad Galileo Otro Ejemplo String: num ‘+’ num ‘*’ num num + *

Oscar Bonilla 120Universidad Galileo Otro Ejemplo String: num ‘+’ num ‘*’ num Hay otro orden de derivación?

Oscar Bonilla 121Universidad Galileo Otro Ejemplo String:

Oscar Bonilla 122Universidad Galileo Otro Ejemplo Producción:  String:

Oscar Bonilla 123Universidad Galileo Otro Ejemplo num Producción:  String: num

Oscar Bonilla 124Universidad Galileo Otro Ejemplo num Producción:  String: num Pero también podemos usar esta producción 

Oscar Bonilla 125Universidad Galileo Otro Ejemplo Producción: String: Pero también podemos usar esta producción 

Oscar Bonilla 126Universidad Galileo Otro Ejemplo Producción:  String:

Oscar Bonilla 127Universidad Galileo Otro Ejemplo num Producción:  String: num

Oscar Bonilla 128Universidad Galileo Otro Ejemplo num Producción:  String: num ‘+’ +

Oscar Bonilla 129Universidad Galileo Otro Ejemplo num Producción:  String: num ‘+’ num +

Oscar Bonilla 130Universidad Galileo Otro Ejemplo num * Producción:  ‘*’ String: num ‘+’ num ‘*’ +

Oscar Bonilla 131Universidad Galileo Otro Ejemplo num * Producción:  String: num ‘+’ num ‘*’ num +

Oscar Bonilla 132Universidad Galileo Otro Ejemplo num * String: num ‘+’ num ‘*’ num +

Oscar Bonilla 133Universidad Galileo Mismo string – Dos derivaciones num ‘+’ num ‘*’ num num * + num + * (23.5 * 86) = 2145( ) * 86 = 12685

Oscar Bonilla 134Universidad Galileo La Gramática es Ambigua Aplicar diferentes ordenes de derivación produce árboles de parseo diferentes Esto no es bueno! –Lleva a resultados ambiguos –Muy probablemente va a producir resultados inesperados Algunas veces el reescribir la gramática con más no-terminales va a eliminar la ambiguedad

Oscar Bonilla 135Universidad Galileo La Gramática Ambigua   ( )  -  num  +  *

Oscar Bonilla 136Universidad Galileo Eliminando la Ambiguedad  +   *   num  ( )   ( )  -  num  +  *

Oscar Bonilla 137Universidad Galileo Eliminando la Ambiguedad String: num ‘+’ num ‘*’ num num + * num num

Oscar Bonilla 138Universidad Galileo Primer ejemplo en la nueva gramática + () * num num ‘*’ ‘(‘ num ‘+’ num ‘)’ num num

Oscar Bonilla 139Universidad Galileo Pregunta: Es esta gramática ambigua?  if then  if then else

Oscar Bonilla 140Universidad Galileo Pregunta: Cómo la hacemos no ambigua?  if then  if then else

Oscar Bonilla 141Universidad Galileo Resumen Overview de análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

Oscar Bonilla 142Universidad Galileo Implementando un Parser La implementación de un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir la producción correcta sin ver que viene en el input (looking ahead)

Oscar Bonilla 143Universidad Galileo Ejemplo de look ahead Gramática  a b  a c  x | x Input string “axxxxxxxxxxxxxxxxx…….” Puede que tengamos que ver un montón de símbolos del input antes de decidirnos por una producción

Oscar Bonilla 144Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas

Oscar Bonilla 145Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas ()

Oscar Bonilla 146Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas () L - parsear de izquierda a derecha R – parsear de derecha a izquierda

Oscar Bonilla 147Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas () L - leftmost derivation R - rightmost derivation

Oscar Bonilla 148Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas () Número de caracteres de lookahead

Oscar Bonilla 149Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas –Ejemplos: LL(0), LR(1) ()

Oscar Bonilla 150Universidad Galileo Siguiente Clase Cómo implementar un Parser Cómo construir un parser engine para un parser shift-reduce Vamos a ver –LR(0) –LR(1) –LALR(1) Parser Engine

Oscar Bonilla 151Universidad Galileo Resumen Qué es análisis sintáctico? Diferencia entre análisis léxico y análisis sintáctico Gramáticas libres de contexto Arboles de Parseo Derivaciones left-most y right-most Top-down and bottom-up parsing Gramáticas Ambiguas Implementación de Parsers

Oscar Bonilla 152Universidad Galileo Grupos Ya tienen que tener grupos Si no tienen grupo todavía, hagánlo! Los listados de grupos van a estar en el Web Si no están en un grupo en el Web hablen con Andreaq