Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen
Oscar Bonilla
Universidad Galileo
Anatomia de un Compilador
Programa (character stream)
Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
Representacin Intermedia
Optimizador
Representacin Intermedia Optimizada
Generador de Cdigo
Cdigo en Assembler
Expresiones Regulares,
Gramticas y Lenguajes
Una expresin 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)*)?
Expresiones Regulares,
Gramticas y Lenguajes
Qu hay acerca de las variables simblicas?
Ejemplo:
num = 0|1|2|3|4|5|6|7|8|9
posint = num num*
int = ( | -) posint
real = int ( | (. posint))
Resumen
Oscar Bonilla
Universidad Galileo
Sintaxis y Semntica de un
Lenguaje de Programacin?
Sintaxis
Como se ve un programa
Representacin textual o estructura
Es posible una definicin matemtica precisa
Semntica
Cul es el significado de un programa
Es ms difcil dar una definicin matemtica
Anatomia de un Compilador
Programa (character stream)
Analizador Lxico (Scanner)
Token Stream
Analizador Sintctico (Parser)
Arbol de Parseo
Generador de Cdigo Intermedio
Representacin Intermedia
Optimizador de Cdigo
Representacin Intermedia Optimizada
Generador de Cdigo
Cdigo en Assembler
Oscar Bonilla
12
Arbol de Parseo
(
123.3
23.6
Universidad Galileo
Definicin de la Sintaxis
Tenemos que proveer una definicin precisa y
fcil de entender de la sintaxis del lenguaje de
programacin
Podemos usar expresiones regulares?
Podemos usar un lenguaje regular para definir un
lenguaje de programacin?
Oscar Bonilla
14
Universidad Galileo
15
Universidad Galileo
NO!
NO!
Intuicin
Resumen
Oscar Bonilla
20
Universidad Galileo
No terminales
Variables sintcticas
Smbolo 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
22
Universidad Galileo
Oscar Bonilla
23
Universidad Galileo
Oscar Bonilla
Terminales
24
Universidad Galileo
Oscar Bonilla
No-terminales
25
Universidad Galileo
Oscar Bonilla
26
Universidad Galileo
Oscar Bonilla
Producciones
27
Universidad Galileo
<A> a
pq
p|q
<S> <P>
<S> <Q>
p*
???
???
P?
Oscar Bonilla
29
Universidad Galileo
Terminales (o tokens)
num para todos los nmeros
plus_op (+), minus_op (-), times_op(*),
left_paren_op((), right_paren_op())
32
Universidad Galileo
Oscar Bonilla
33
Universidad Galileo
Oscar Bonilla
34
Universidad Galileo
Oscar Bonilla
35
Universidad Galileo
Oscar Bonilla
36
Universidad Galileo
Oscar Bonilla
37
Universidad Galileo
Oscar Bonilla
38
Universidad Galileo
Oscar Bonilla
39
Universidad Galileo
Oscar Bonilla
40
Universidad Galileo
Oscar Bonilla
41
Universidad Galileo
Oscar Bonilla
42
Universidad Galileo
Resumen
Oscar Bonilla
43
Universidad Galileo
Derivaciones
Cmo mostramos que una secuencia de tokens
es aceptada por una CFG?
Una produccin es usada para derivar una
secuencia de tokens a partir del smbolo de
inicio
Dados los strings , y
y una produccin A
Un solo paso de la derivacin es
Ejemplo de Derivacin
Gramtica
<expr> <expr><op><expr> | (<expr>) | -<expr> | num
<op> + | *
Entrada
36 * ( 8 + 23.4)
Token Stream
num * ( num + num )
Oscar Bonilla
45
Universidad Galileo
Ejemplo de Derivacin
<expr>
46
Universidad Galileo
Ejemplo de Derivacin
<expr>
47
Universidad Galileo
Ejemplo de Derivacin
<expr> <expr><op><expr>
<expr>
48
Universidad Galileo
Ejemplo de Derivacin
<expr> <expr><op><expr>
<expr>
49
Universidad Galileo
Ejemplo de Derivacin
<expr>
50
Universidad Galileo
Ejemplo de Derivacin
<expr>
51
Universidad Galileo
Ejemplo de Derivacin
<expr> num
<expr>
52
Universidad Galileo
Ejemplo de Derivacin
<expr> num
<expr>
53
Universidad Galileo
Ejemplo de Derivacin
<expr>
54
Universidad Galileo
Ejemplo de Derivacin
<expr>
55
Universidad Galileo
Ejemplo de Derivacin
<op> *
<expr>
56
Universidad Galileo
Ejemplo de Derivacin
<op> *
<expr>
57
Universidad Galileo
Ejemplo de Derivacin
<expr>
58
Universidad Galileo
Ejemplo de Derivacin
<expr>
59
Universidad Galileo
Ejemplo de Derivacin
<expr> (<expr>)
<expr>
60
Universidad Galileo
Ejemplo de Derivacin
<expr> (<expr>)
<expr>
61
Universidad Galileo
Ejemplo de Derivacin
<expr>
62
Universidad Galileo
Ejemplo de Derivacin
<expr>
63
Universidad Galileo
Ejemplo de Derivacin
<expr> <expr><op><expr>
<expr>
64
Universidad Galileo
Ejemplo de Derivacin
<expr> <expr><op><expr>
<expr>
65
Universidad Galileo
Ejemplo de Derivacin
<expr>
66
Universidad Galileo
Ejemplo de Derivacin
<expr>
67
Universidad Galileo
Ejemplo de Derivacin
<expr> num
<expr>
68
Universidad Galileo
Ejemplo de Derivacin
<expr> num
<expr>
Oscar Bonilla
69
Universidad Galileo
Ejemplo de Derivacin
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
70
Universidad Galileo
Ejemplo de Derivacin
<expr>
Oscar Bonilla
71
Universidad Galileo
Ejemplo de Derivacin
<op> +
<expr>
Oscar Bonilla
72
Universidad Galileo
Ejemplo de Derivacin
<op> +
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
73
Universidad Galileo
Ejemplo de Derivacin
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
74
Universidad Galileo
Ejemplo de Derivacin
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
75
Universidad Galileo
Ejemplo de Derivacin
<expr> num
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
76
Universidad Galileo
Ejemplo de Derivacin
<expr> num
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
num * ( num + num )
77
Universidad Galileo
Ejemplo de Derivacin
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
num * ( num + num )
78
Universidad Galileo
Arbol de Parseo
Representacin grfica 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 produccin
<expr>
Oscar Bonilla
80
Universidad Galileo
<expr>
Oscar Bonilla
<op>
<expr>
81
Universidad Galileo
num
<expr>
<expr>
<op>
<expr>
num
Oscar Bonilla
82
Universidad Galileo
<op>
*
<expr>
<expr>
num
Oscar Bonilla
<op>
<expr>
83
Universidad Galileo
( <expr> )
<expr>
<expr>
num
Oscar Bonilla
<op>
<expr>
<expr>
84
Universidad Galileo
<expr>
num
<op>
<expr>
<expr>
<expr> <op>
Oscar Bonilla
85
)
<expr>
Universidad Galileo
num
<expr>
<expr>
num
<op>
<expr>
<expr>
<expr> <op>
)
<expr>
num
Oscar Bonilla
86
Universidad Galileo
<op>
+
<expr>
<expr>
num
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
87
)
<expr>
+
Universidad Galileo
num
<expr>
<expr>
num
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
88
)
<expr>
num
Universidad Galileo
num
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
89
)
<expr>
num
Universidad Galileo
Resumen
Oscar Bonilla
90
Universidad Galileo
Rightmost derivation
Encontramos el no-terminal de ms a la derecha y le
aplicamos una produccin
Ejemplo de Right-Derivation
Produccin:
String:
<expr>
<expr>
Oscar Bonilla
92
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <expr> <expr> <op> <expr>
String:
<expr> <op> <expr>
<expr>
<expr>
Oscar Bonilla
<op>
<expr>
93
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <expr> ( <expr> )
String:
<expr> <op> ( <expr> )
<expr>
<expr>
<op>
<expr>
<expr>
Oscar Bonilla
94
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <expr> <expr> <op> <expr>
String:
<expr> <op> ( <expr> <op> <expr> )
<expr>
<expr>
<op>
<expr>
<expr>
<expr> <op>
Oscar Bonilla
95
)
<expr>
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <expr> num
String:
<expr> <op> ( <expr> <op> num )
<expr>
<expr>
<op>
<expr>
<expr>
<expr> <op>
)
<expr>
num
Oscar Bonilla
96
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <op> +
String:
<expr> <op> ( <expr> + num )
<expr>
<expr>
<op>
<expr>
<expr>
<expr> <op>
+
Oscar Bonilla
97
)
<expr>
num
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <expr> num
String:
<expr> <op> ( num + num )
<expr>
<expr>
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
98
)
<expr>
num
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <op> *
String:
<expr> * ( num + num )
<expr>
<expr>
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
99
)
<expr>
num
Universidad Galileo
Ejemplo de Right-Derivation
Produccin: <expr> num
String:
num * ( num + num )
<expr>
<expr>
num
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
100
)
<expr>
num
Universidad Galileo
Ejemplo de Right-Derivation
String:
<expr>
num
<op>
<expr>
<expr>
<expr> <op>
num
Oscar Bonilla
101
)
<expr>
num
Universidad Galileo
Ejemplo de Right-Derivation
Oscar Bonilla
<expr>
<expr> <op> <expr>
<expr> <op> ( <expr> )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> <op> num )
<expr> <op> ( <expr> + num )
<expr> <op> ( num + num )
<expr> * ( num + num )
num * ( num + num )
102
Universidad Galileo
Top-down Parsing
Left-most derivation
<expr>
<expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )
num * ( num <op> <expr> )
num * ( num + <expr> )
num * ( num + num )
Oscar Bonilla
104
Universidad Galileo
Bottom-up Parsing
Right-most derivation
<expr>
<expr> <op> <expr>
<expr> <op> ( <expr> )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> <op> num )
<expr> <op> ( <expr> + num )
<expr> <op> ( num + num )
<expr> * ( num + num )
num * ( num + num )
Oscar Bonilla
106
Universidad Galileo
Bottom-up Parsing
Right-most derivation
<expr>
<expr> <op> <expr>
<expr> <op> ( <expr> )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> <op> num )
<expr> <op> ( <expr> + num )
<expr> <op> ( num + num )
<expr> * ( num + num )
num * ( num + num )
Oscar Bonilla
107
Universidad Galileo
Bottom-up Parsing
Right-most derivation
num * ( num + num )
<expr> * ( num + num )
<expr> <op> ( num + num )
<expr> <op> ( <expr> + num )
<expr> <op> ( <expr> <op> num )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> )
<expr> <op> <expr>
<expr>
Oscar Bonilla
108
Universidad Galileo
Resumen
Oscar Bonilla
109
Universidad Galileo
Otro Ejemplo
Entrada:
124 + 23.5 * 86
Token Stream:
num + num * num
Oscar Bonilla
110
Universidad Galileo
Otro Ejemplo
Produccin:
String:
<expr>
<expr>
Oscar Bonilla
111
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <expr> <op> <expr>
String:
<expr> <op> <expr>
<expr>
<expr>
Oscar Bonilla
<op>
<expr>
112
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <num>
String:
num <op> <expr>
<expr>
<expr>
<op>
<expr>
num
Oscar Bonilla
113
Universidad Galileo
Otro Ejemplo
Produccin: <op> +
String:
num + <expr>
<expr>
<expr>
num
Oscar Bonilla
<op>
<expr>
114
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <expr> <op> <expr>
String:
num + <expr> <op> <expr>
<expr>
<expr>
num
Oscar Bonilla
<op>
<expr>
<expr>
<op>
115
<expr>
Universidad Galileo
Otro Ejemplo
Produccin: <expr> num
String:
num + num <op> <expr>
<expr>
<expr>
num
<op>
<expr>
<expr>
<op>
<expr>
num
Oscar Bonilla
116
Universidad Galileo
Otro Ejemplo
Produccin: <op> *
String:
num + num * <expr>
<expr>
<expr>
num
Oscar Bonilla
<op>
<expr>
<expr>
<op>
num
117
<expr>
Universidad Galileo
Otro Ejemplo
Produccin: <expr> num
String:
num + num * num
<expr>
<expr>
num
Oscar Bonilla
<op>
<expr>
<expr>
<op>
<expr>
num
num
118
Universidad Galileo
Otro Ejemplo
String:
<expr>
num
Oscar Bonilla
<op>
<expr>
<expr>
<op>
<expr>
num
num
119
Universidad Galileo
Otro Ejemplo
String:
Oscar Bonilla
120
Universidad Galileo
Otro Ejemplo
String:
<expr>
<expr>
Oscar Bonilla
121
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <expr> <op> <expr>
String:
<expr> <op> <expr>
<expr>
<expr>
Oscar Bonilla
<op>
122
<expr>
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <num>
String:
num <op> <expr>
<expr>
<expr>
<op>
<expr>
num
Oscar Bonilla
123
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <num>
String:
num <op> <expr>
<expr>
<expr>
<op>
<expr>
num
124
Universidad Galileo
Otro Ejemplo
Produccin:
String:
<expr> <op> <expr>
<expr>
<expr>
<op>
<expr>
125
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <expr> <op> <expr>
String:
<expr> <op> <expr> <op> <expr>
<expr>
<expr>
<expr>
Oscar Bonilla
<op>
<op>
<expr>
<expr>
126
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <num>
String:
num <op> <expr> <op> <expr>
<expr>
<expr>
<expr>
<op>
<op>
<expr>
<expr>
num
Oscar Bonilla
127
Universidad Galileo
Otro Ejemplo
Produccin: <op> <+>
String:
num + <expr> <op> <expr>
<expr>
<expr>
<expr>
<op>
num
Oscar Bonilla
<op>
<expr>
<expr>
128
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <num>
String:
num + num <op> <expr>
<expr>
<expr>
<op>
<expr>
<op>
<expr>
num
num
Oscar Bonilla
129
<expr>
Universidad Galileo
Otro Ejemplo
Produccin: <op> *
String:
num + num * <expr>
<expr>
<expr>
<op>
<expr>
<op>
<expr>
num
num
Oscar Bonilla
<expr>
130
Universidad Galileo
Otro Ejemplo
Produccin: <expr> <num>
String:
num + num * num
<expr>
<expr>
<expr>
<op>
<expr>
num
num
Oscar Bonilla
<op>
<expr>
num
131
Universidad Galileo
Otro Ejemplo
String:
<expr>
<op>
<expr>
num
num
Oscar Bonilla
<op>
<expr>
num
132
Universidad Galileo
<expr>
num
<expr>
<expr>
<op>
<expr>
<expr>
<expr>
num
num
<op>
<op>
<expr>
<expr>
num
num
La Gramtica es Ambigua
Aplicar diferentes ordenes de derivacin
produce rboles de parseo diferentes
Esto no es bueno!
Lleva a resultados ambiguos
Muy probablemente va a producir resultados
inesperados
La Gramtica Ambigua
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Eliminando la Ambiguedad
<expr> <expr> + <term>
<expr> <term>
<term> <term> * <unit>
<term> <unit>
<expr>
<unit> num
<expr>
<unit> ( <expr> )
<expr>
Eliminando la Ambiguedad
String:
<expr>
<term>
<term>
<term>
<unit>
<unit>
num
num
<unit>
num
<term>
<term>
<unit>
num
<unit>
<expr>
(
<expr>
)
<term>
<term>
<unit>
<unit>
num
num
Oscar Bonilla
139
Universidad Galileo
Oscar Bonilla
140
Universidad Galileo
Resumen
Oscar Bonilla
141
Universidad Galileo
Implementando un Parser
La implementacin de un parser para algunas
CFGs puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir la produccin correcta sin ver
que viene en el input (looking ahead)
143
Universidad Galileo
Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead
Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead
Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead
Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead
Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead
Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead
Siguiente Clase
Cmo implementar un Parser
Cmo construir un parser engine
para un parser shift-reduce
Vamos a ver
LR(0)
LR(1)
LALR(1)
Parser
Engine
Resumen
Qu es anlisis sintctico?
Diferencia entre anlisis lxico y anlisis
sintctico
Gramticas libres de contexto
Arboles de Parseo
Derivaciones left-most y right-most
Top-down and bottom-up parsing
Gramticas Ambiguas
Implementacin de Parsers
Oscar Bonilla
151
Universidad Galileo
Grupos
Ya tienen que tener grupos
Si no tienen grupo todava, hagnlo!
Los listados de grupos van a estar en el Web
Si no estn en un grupo en el Web hablen con
Andreaq