Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porHugo Arrua Modificado hace 7 años
1
Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones
2
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
3
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)
4
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
5
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
6
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)*)?
7
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
8
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
9
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
10
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
11
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)
12
Oscar Bonilla 12Universidad Galileo Entrada y Salida de un Parser - ( ) 123.3 23.6 + minus_op left_paren_op num(123.3) plus_op num(23.6) right_paren_op Token StreamArbol de Parseo Entrada: - (123.3 + 23.6) Analizador Sintáctico (Parser)
13
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?
14
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; }
15
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: {{}{{{}{{}}}}}
16
Oscar Bonilla 16Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular?
17
Oscar Bonilla 17Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular? NO!
18
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
19
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
20
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
21
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)
22
Oscar Bonilla 22Universidad Galileo Ejemplo de una CFG ( ) | ε
23
Oscar Bonilla 23Universidad Galileo Ejemplo de una CFG ( ) ε
24
Oscar Bonilla 24Universidad Galileo Ejemplo de una CFG ( ) ε Terminales
25
Oscar Bonilla 25Universidad Galileo Ejemplo de una CFG ( ) ε No-terminales
26
Oscar Bonilla 26Universidad Galileo Ejemplo de una CFG ( ) ε Símbolo de Inicio:
27
Oscar Bonilla 27Universidad Galileo Ejemplo de una CFG ( ) ε Producciones
28
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 * ε
29
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? ???
30
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
31
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
32
Oscar Bonilla 32Universidad Galileo Ejemplo: Una CFG para expresiones Expresiones aritméticas simples con + y * –8.2 + 35.6 –8.32 + 86 * 45.3 –(6.001 + 6.004) * (6.035 * -(6.042 + 6.046)) 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?
33
Oscar Bonilla 33Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + *
34
Oscar Bonilla 34Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + * Terminales
35
Oscar Bonilla 35Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + * Terminales
36
Oscar Bonilla 36Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + * No-terminales
37
Oscar Bonilla 37Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + * No-terminales
38
Oscar Bonilla 38Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + * Símbolo de Inicio:
39
Oscar Bonilla 39Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + * Producciones
40
Oscar Bonilla 40Universidad Galileo Ejemplo: Una CFG para expresiones ( ) - num + *
41
Oscar Bonilla 41Universidad Galileo Ejemplo: Una CFG para expresiones | ( ) | - | num + | *
42
Oscar Bonilla 42Universidad Galileo Pregunta: Cuál es el lenguaje definido por esta CFG? a a | aa
43
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
44
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
45
Oscar Bonilla 45Universidad Galileo Ejemplo de Derivación Gramática | ( ) | - | num + | * Entrada 36 * ( 8 + 23.4) Token Stream num ‘*’ ‘(‘ num ‘+’ num ‘)’
46
Oscar Bonilla 46Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’
47
Oscar Bonilla 47Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’
48
Oscar Bonilla 48Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’
49
Oscar Bonilla 49Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’
50
Oscar Bonilla 50Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’
51
Oscar Bonilla 51Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’
52
Oscar Bonilla 52Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’ num
53
Oscar Bonilla 53Universidad Galileo Ejemplo de Derivación num num ‘*’ ‘(‘ num ‘+’ num ‘)’ num
54
Oscar Bonilla 54Universidad Galileo Ejemplo de Derivación num num ‘*’ ‘(‘ num ‘+’ num ‘)’
55
Oscar Bonilla 55Universidad Galileo Ejemplo de Derivación num num ‘*’ ‘(‘ num ‘+’ num ‘)’
56
Oscar Bonilla 56Universidad Galileo Ejemplo de Derivación num num ‘*’ ‘(‘ num ‘+’ num ‘)’ *
57
Oscar Bonilla 57Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ *
58
Oscar Bonilla 58Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
59
Oscar Bonilla 59Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
60
Oscar Bonilla 60Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ ( )
61
Oscar Bonilla 61Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ ( )
62
Oscar Bonilla 62Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
63
Oscar Bonilla 63Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
64
Oscar Bonilla 64Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
65
Oscar Bonilla 65Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
66
Oscar Bonilla 66Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
67
Oscar Bonilla 67Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
68
Oscar Bonilla 68Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ num
69
Oscar Bonilla 69Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ num
70
Oscar Bonilla 70Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
71
Oscar Bonilla 71Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
72
Oscar Bonilla 72Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ +
73
Oscar Bonilla 73Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ +
74
Oscar Bonilla 74Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
75
Oscar Bonilla 75Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
76
Oscar Bonilla 76Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ num
77
Oscar Bonilla 77Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ num
78
Oscar Bonilla 78Universidad Galileo Ejemplo de Derivación num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
79
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
80
Oscar Bonilla 80Universidad Galileo Ejemplo de Arbol de Parseo
81
Oscar Bonilla 81Universidad Galileo Ejemplo de Arbol de Parseo
82
Oscar Bonilla 82Universidad Galileo Ejemplo de Arbol de Parseo num num
83
Oscar Bonilla 83Universidad Galileo Ejemplo de Arbol de Parseo ‘*’ * num
84
Oscar Bonilla 84Universidad Galileo Ejemplo de Arbol de Parseo ‘(‘ ‘)’ ()* num
85
Oscar Bonilla 85Universidad Galileo Ejemplo de Arbol de Parseo ()* num
86
Oscar Bonilla 86Universidad Galileo Ejemplo de Arbol de Parseo num num ()*
87
Oscar Bonilla 87Universidad Galileo Ejemplo de Arbol de Parseo ‘+’ num + ()*
88
Oscar Bonilla 88Universidad Galileo Ejemplo de Arbol de Parseo num num + ()*
89
Oscar Bonilla 89Universidad Galileo Ejemplo de Arbol de Parseo num + ()* num ‘*’ ‘(‘ num ‘+’ num ‘)’
90
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
91
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
92
Oscar Bonilla 92Universidad Galileo Ejemplo de Right-Derivation Producción: String:
93
Oscar Bonilla 93Universidad Galileo Ejemplo de Right-Derivation Producción: String:
94
Oscar Bonilla 94Universidad Galileo Ejemplo de Right-Derivation () Producción: ‘(‘ ‘)’ String: ‘(‘ ‘)’
95
Oscar Bonilla 95Universidad Galileo Ejemplo de Right-Derivation () Producción: String: ‘(‘ ‘)’
96
Oscar Bonilla 96Universidad Galileo Ejemplo de Right-Derivation num () Producción: num String: ‘(‘ num ‘)’
97
Oscar Bonilla 97Universidad Galileo Ejemplo de Right-Derivation num + () Producción: ‘+’ String: ‘(‘ ‘+’ num ‘)’
98
Oscar Bonilla 98Universidad Galileo Ejemplo de Right-Derivation num + () Producción: num String: ‘(‘ num ‘+’ num ‘)’
99
Oscar Bonilla 99Universidad Galileo Ejemplo de Right-Derivation num + ()* Producción: ‘*’ String: ‘*’ ‘(‘ num ‘+’ num ‘)’
100
Oscar Bonilla 100Universidad Galileo Ejemplo de Right-Derivation num + ()* Producción: num String: num ‘*’ ‘(‘ num ‘+’ num ‘)’
101
Oscar Bonilla 101Universidad Galileo Ejemplo de Right-Derivation num + ()* String: num ‘*’ ‘(‘ num ‘+’ num ‘)’
102
Oscar Bonilla 102Universidad Galileo Ejemplo de Right-Derivation ‘(‘ ‘)’ ‘(‘ num ‘)’ ‘(‘ ‘+’ num ‘)’’ ‘(‘ num ‘+’ num ‘)’ ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
103
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
104
Oscar Bonilla 104Universidad Galileo Top-down Parsing Left-most derivation num num ‘*’ num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
105
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
106
Oscar Bonilla 106Universidad Galileo Bottom-up Parsing Right-most derivation ‘(‘ ‘)’ ‘(‘ num ‘)’ ‘(‘ ‘+’ num ‘)’’ ‘(‘ num ‘+’ num ‘)’ ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
107
Oscar Bonilla 107Universidad Galileo Bottom-up Parsing Right-most derivation ‘(‘ ‘)’ ‘(‘ num ‘)’ ‘(‘ ‘+’ num ‘)’’ ‘(‘ num ‘+’ num ‘)’ ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’
108
Oscar Bonilla 108Universidad Galileo Bottom-up Parsing Right-most derivation num ‘*’ ‘(‘ num ‘+’ num ‘)’ ‘*’ ‘(‘ num ‘+’ num ‘)’ ‘(‘ num ‘+’ num ‘)’ ‘(‘ ‘+’ num ‘)’ ‘(‘ num ‘)’ ‘(‘ ‘)’
109
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
110
Oscar Bonilla 110Universidad Galileo Otro Ejemplo Entrada: 124 + 23.5 * 86 Token Stream: num ‘+’ num ‘*’ num
111
Oscar Bonilla 111Universidad Galileo Otro Ejemplo Producción: String:
112
Oscar Bonilla 112Universidad Galileo Otro Ejemplo Producción: String:
113
Oscar Bonilla 113Universidad Galileo Otro Ejemplo num Producción: String: num
114
Oscar Bonilla 114Universidad Galileo Otro Ejemplo + num Producción: ‘+’ String: num ‘+’
115
Oscar Bonilla 115Universidad Galileo Otro Ejemplo Producción: String: num ‘+’ + num
116
Oscar Bonilla 116Universidad Galileo Otro Ejemplo Producción: num String: num ‘+’ num num +
117
Oscar Bonilla 117Universidad Galileo Otro Ejemplo num + Producción: ‘*’ String: num ‘+’ num ‘*’ *
118
Oscar Bonilla 118Universidad Galileo Otro Ejemplo num + Producción: num String: num ‘+’ num ‘*’ num *
119
Oscar Bonilla 119Universidad Galileo Otro Ejemplo String: num ‘+’ num ‘*’ num num + *
120
Oscar Bonilla 120Universidad Galileo Otro Ejemplo String: num ‘+’ num ‘*’ num Hay otro orden de derivación?
121
Oscar Bonilla 121Universidad Galileo Otro Ejemplo String:
122
Oscar Bonilla 122Universidad Galileo Otro Ejemplo Producción: String:
123
Oscar Bonilla 123Universidad Galileo Otro Ejemplo num Producción: String: num
124
Oscar Bonilla 124Universidad Galileo Otro Ejemplo num Producción: String: num Pero también podemos usar esta producción
125
Oscar Bonilla 125Universidad Galileo Otro Ejemplo Producción: String: Pero también podemos usar esta producción
126
Oscar Bonilla 126Universidad Galileo Otro Ejemplo Producción: String:
127
Oscar Bonilla 127Universidad Galileo Otro Ejemplo num Producción: String: num
128
Oscar Bonilla 128Universidad Galileo Otro Ejemplo num Producción: String: num ‘+’ +
129
Oscar Bonilla 129Universidad Galileo Otro Ejemplo num Producción: String: num ‘+’ num +
130
Oscar Bonilla 130Universidad Galileo Otro Ejemplo num * Producción: ‘*’ String: num ‘+’ num ‘*’ +
131
Oscar Bonilla 131Universidad Galileo Otro Ejemplo num * Producción: String: num ‘+’ num ‘*’ num +
132
Oscar Bonilla 132Universidad Galileo Otro Ejemplo num * String: num ‘+’ num ‘*’ num +
133
Oscar Bonilla 133Universidad Galileo Mismo string – Dos derivaciones num ‘+’ num ‘*’ num num * + num + * 124 + (23.5 * 86) = 2145(124 + 23.5) * 86 = 12685
134
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
135
Oscar Bonilla 135Universidad Galileo La Gramática Ambigua ( ) - num + *
136
Oscar Bonilla 136Universidad Galileo Eliminando la Ambiguedad + * num ( ) ( ) - num + *
137
Oscar Bonilla 137Universidad Galileo Eliminando la Ambiguedad String: num ‘+’ num ‘*’ num num + * num num
138
Oscar Bonilla 138Universidad Galileo Primer ejemplo en la nueva gramática + () * num num ‘*’ ‘(‘ num ‘+’ num ‘)’ num num
139
Oscar Bonilla 139Universidad Galileo Pregunta: Es esta gramática ambigua? if then if then else
140
Oscar Bonilla 140Universidad Galileo Pregunta: Cómo la hacemos no ambigua? if then if then else
141
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
142
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)
143
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
144
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
145
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 ()
146
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
147
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
148
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
149
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) ()
150
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
151
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
152
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
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.