Sunteți pe pagina 1din 152

Compiladores

Introduccin al Anlisis Sintctico


Gramticas de Contexto Libre,
Arboles de Parseo y Derivaciones
Oscar Bonilla 2 Universidad Galileo
Resumen
Overview del anlisis lxico
Qu es anlisis sintctico
Gramticas libres de contexto
Derivaciones y rboles de parseo
Top-down vs. Bottom-up Parsing
Grmaticas Ambiguas
Implementando un Parser

Oscar Bonilla 3 Universidad Galileo
Anatomia de un Compilador
Optimizador
Generador de Cdigo
Representacin Intermedia Optimizada
Cdigo en Assembler
Generador de Cdigo Intermedio
Representacin Intermedia
Analizador Lxico (Scanner)
Analizador Sintctico (Parser)
Token Stream
Arbol de Parseo
Programa (character stream)
Oscar Bonilla 4 Universidad Galileo
Resumen de Anlisis Lxico
El analizador lxico crea tokens a partir de un
character stream
Los tokens se definen usando expresiones
regulares
Oscar Bonilla 5 Universidad Galileo
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)*)?

Un lenguaje regular es un lenguaje definido por
una expresin regular
Oscar Bonilla 6 Universidad Galileo
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))
Slo son una abreviacin, 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 7 Universidad Galileo
Resumen de Anlisis Lxico
El analizador lxico 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 Determinstico (NFA)
Por construccin simple
NFA se transforma a un DFA
Algoritmo de transformacin
Ejecutar un DFA es fcil
Oscar Bonilla 8 Universidad Galileo
Resumen
Overview del anlisis lxico
Qe es anlisis sintctico
Gramticas libres de contexto
Derivacin y Arboles de Parseo
Top-down vs. Bottom-up Parsing
Gramticas Ambiguas
Implementando un Parser
Oscar Bonilla 9 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
Oscar Bonilla 10 Universidad Galileo
Por qu hacer anlisis sintctico?
Podemos proveer una definicin precisa y fcil
de entender
Una gramtica apropiada imparte estructura a
un lenguaje de programacin
Podemos construir automticamente un parser
que determine si el programa es sintcticamente
correcto
Ayuda en el proceso de traduccin
Fcil modificar/aadir al lenguaje
Oscar Bonilla 11 Universidad Galileo
Anatomia de un Compilador
Optimizador de Cdigo
Generador de Cdigo
Representacin Intermedia Optimizada
Cdigo en Assembler
Generador de Cdigo Intermedio
Representacin Intermedia
Analizador Lxico (Scanner)
Analizador Sintctico (Parser)
Token Stream
Arbol de Parseo
Programa (character stream)
Oscar Bonilla 12 Universidad 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 Stream Arbol de Parseo
Entrada: - (123.3 + 23.6)
A
n
a
l
i
z
a
d
o
r

S
i
n
t

c
t
i
c
o

(
P
a
r
s
e
r
)

Oscar Bonilla 13 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
Ejemplo: Scope Jerrquico
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 15 Universidad Galileo
Ejemplo: Scope Jerrquico
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 parntesis balanceados
Ejemplo: {{}{{{}{{}}}}}
Oscar Bonilla 16 Universidad Galileo
Problema de los parntesis
balanceados
Podemos definir esto usando una expresin regular?
Oscar Bonilla 17 Universidad Galileo
Problema de los parntesis
balanceados
Podemos definir esto usando una expresin regular?
NO!
Oscar Bonilla 18 Universidad Galileo
Problema de los parntesis
balanceados
Podemos definir esto usando una expresin regular?
NO!
Intuicin
Nmero de parntesis abiertos debe ser igual a
nmero de parntesis cerrados
Necesitamos mantener un conteo o necesitamos
recursin
Adems: NFAs y DFAs no pueden ejecutar conteo
sin lmites
Oscar Bonilla 19 Universidad Galileo
Problema de los parntesis
balanceados
Hay alguna gramtica que defina esto?

<S> ( <S> ) <S> |

La definicin es recursiva
Esta es una gramtica libre de contexto
Es ms expresiva que las expresiones regulares
Oscar Bonilla 20 Universidad Galileo
Resumen
Overview del anlisis lxico
Qu es anlisis sintctico?
Gramticas libres de contexto
Derivacin y Arboles de Parseo
Top-down vs. Bottom-up Parsing
Gramticas Ambiguas
Implementando un Parser
Oscar Bonilla 21 Universidad Galileo
Definiendo Context-Free Grammars
(CFGs)
Terminales
Smbolos para strings o tokens
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
Ejemplo de una CFG
<S> ( <S> ) <S> |
Oscar Bonilla 23 Universidad Galileo
Ejemplo de una CFG
<S> ( <S> ) <S>

<S>

Oscar Bonilla 24 Universidad Galileo
Ejemplo de una CFG
<S> ( <S> ) <S>

<S>

Terminales
Oscar Bonilla 25 Universidad Galileo
Ejemplo de una CFG
<S> ( <S> ) <S>

<S>

No-terminales
Oscar Bonilla 26 Universidad Galileo
Ejemplo de una CFG
<S> ( <S> ) <S>

<S>

Smbolo de Inicio: <S>
Oscar Bonilla 27 Universidad Galileo
Ejemplo de una CFG
<S> ( <S> ) <S>

<S>

Producciones
Oscar Bonilla 28 Universidad Galileo
Los lenguajes regulares son un subconjunto
de los lenguajes libres de contexto
a
Expresin Regular Gramtica libre de contexto
<A> a
p q <S> <P> <Q>
Si p y q son expresiones regulares, usando CFGs <P> y <Q>
p | q <S> <P>
<S> <Q>
p * <S> <S> <P>
<S>
Oscar Bonilla 29 Universidad Galileo
Los lenguajes regulares son un subconjunto
de los lenguajes libres de contexto
???
<S> <S> <P>
<S> <P>
Si p es una expresin regular, usando una CFG <P>,

Qu es?
Expresin Regular Gramtica libre de contexto
P?
???
Oscar Bonilla 30 Universidad Galileo
Entonces por qu usar expresiones
regulares?
Separar el anlisis sintctico en partes lxica y no-
lxica es una buena modularizacin

Las reglas lxicas son simples y pueden ser expresadas
usando expresiones regulares

Las expresiones regulares son ms concisas

Las implementaciones de analizadores lxicos para
expresiones regulares son ms eficientes
Oscar Bonilla 31 Universidad 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 32 Universidad Galileo
Ejemplo: Una CFG para expresiones
Expresiones aritmticas 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 nmeros
plus_op (+), minus_op (-), times_op(*),
left_paren_op((), right_paren_op())
Cul es la gramtica para todas las expresiones
posibles?
Oscar Bonilla 33 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Oscar Bonilla 34 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Terminales
Oscar Bonilla 35 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Terminales
Oscar Bonilla 36 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
No-terminales
Oscar Bonilla 37 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
No-terminales
Oscar Bonilla 38 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Smbolo de Inicio:
<expr>
Oscar Bonilla 39 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Producciones
Oscar Bonilla 40 Universidad Galileo
Ejemplo: Una CFG para expresiones
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Oscar Bonilla 41 Universidad Galileo
Ejemplo: Una CFG para expresiones



<expr> <expr> <op> <expr> | ( <expr> )
| - <expr> | num

<op> + | *

Oscar Bonilla 42 Universidad Galileo
Pregunta: Cul es el lenguaje
definido por esta CFG?




<S> a<S>a | aa



Oscar Bonilla 43 Universidad Galileo
Resumen
Overview de anlisis lxico
Qu es anlisis sintctico?
Gramticas libres de contexto
Derivaciones y Arboles de Parseo
Top-down vs. Bottom-up Parsing
Gramticas Ambiguas
Implementando un Parser
Oscar Bonilla 44 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
A
Oscar Bonilla 45 Universidad Galileo
Ejemplo de Derivacin
Gramtica
<expr> <expr><op><expr> | (<expr>) | -<expr> | num
<op> + | *

Entrada
36 * ( 8 + 23.4)

Token Stream
num * ( num + num )

Oscar Bonilla 46 Universidad Galileo
Ejemplo de Derivacin
<expr>
num * ( num + num )
Oscar Bonilla 47 Universidad Galileo
Ejemplo de Derivacin
<expr>
num * ( num + num )
Oscar Bonilla 48 Universidad Galileo
Ejemplo de Derivacin
<expr>

num * ( num + num )
<expr> <expr><op><expr>
Oscar Bonilla 49 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>

num * ( num + num )
<expr> <expr><op><expr>
Oscar Bonilla 50 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>

num * ( num + num )
Oscar Bonilla 51 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>

num * ( num + num )
Oscar Bonilla 52 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>


num * ( num + num )
<expr> num
Oscar Bonilla 53 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>

num * ( num + num )
<expr> num
Oscar Bonilla 54 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>

num * ( num + num )
Oscar Bonilla 55 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>

num * ( num + num )
Oscar Bonilla 56 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>


num * ( num + num )
<op> *
Oscar Bonilla 57 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>

num * ( num + num )
<op> *
Oscar Bonilla 58 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>


num * ( num + num )
Oscar Bonilla 59 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>


num * ( num + num )
Oscar Bonilla 60 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>

num * ( num + num )
<expr> (<expr>)
Oscar Bonilla 61 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )

num * ( num + num )
<expr> (<expr>)
Oscar Bonilla 62 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )

num * ( num + num )
Oscar Bonilla 63 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )

num * ( num + num )
Oscar Bonilla 64 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )


num * ( num + num )
<expr> <expr><op><expr>
Oscar Bonilla 65 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )

num * ( num + num )
<expr> <expr><op><expr>
Oscar Bonilla 66 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )

num * ( num + num )
Oscar Bonilla 67 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )

num * ( num + num )
Oscar Bonilla 68 Universidad Galileo
Ejemplo de Derivacin
<expr> <expr> <op> <expr>
num <op> <expr>
num * <expr>
num * ( <expr> )
num * ( <expr> <op> <expr> )


num * ( num + num )
<expr> num
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> )

num * ( num + num )
<expr> num
Oscar Bonilla 70 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 + num )
Oscar Bonilla 71 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 + num )
Oscar Bonilla 72 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 + num )
<op> +
Oscar Bonilla 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> )

num * ( num + num )
<op> +
Oscar Bonilla 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> )

num * ( num + num )
Oscar Bonilla 75 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 )
Oscar Bonilla 76 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 )
<expr> num
Oscar Bonilla 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 )
num * ( num + num )
<expr> num
Oscar Bonilla 78 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 )
num * ( num + num )
Oscar Bonilla 79 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
Oscar Bonilla 80 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr>
Oscar Bonilla 81 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> <expr> <op> <expr>

<expr>
<expr> <expr> <op>
Oscar Bonilla 82 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> num

num
<expr>
<expr> <expr> <op>
Oscar Bonilla 83 Universidad Galileo
Ejemplo de Arbol de Parseo
<op> *

*
num
<expr>
<expr> <expr> <op>
Oscar Bonilla 84 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> ( <expr> )

( ) *
num
<expr>
<expr> <expr>
<expr>
<op>
Oscar Bonilla 85 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> <expr> <op> <expr>

( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Oscar Bonilla 86 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> num

num
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Oscar Bonilla 87 Universidad Galileo
Ejemplo de Arbol de Parseo
<op> +

num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Oscar Bonilla 88 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> num
num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Oscar Bonilla 89 Universidad Galileo
Ejemplo de Arbol de Parseo


num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
num * ( num + num )
Oscar Bonilla 90 Universidad Galileo
Resumen
Overview del anlisis lxico
Qu es anlisis sintctico?
Gramticas libres de contexto
Derivaciones y Arboles de Parseo
Top-down vs. Bottom-up Parsing
Gramticas Ambiguas
Implementando un Parser
Oscar Bonilla 91 Universidad Galileo
Derivaciones left-most vs. right-most
Leftmost derivation
En el string, encontramos el no-terminal de ms a la
izquierda y le aplicamos una produccin
El ejemplo anterior fue de una leftmos derivation

Rightmost derivation
Encontramos el no-terminal de ms a la derecha y le
aplicamos una produccin
Oscar Bonilla 92 Universidad Galileo
Ejemplo de Right-Derivation


<expr>
Produccin:
String: <expr>
Oscar Bonilla 93 Universidad Galileo
Ejemplo de Right-Derivation


<expr>
<expr> <expr> <op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> <expr>
Oscar Bonilla 94 Universidad Galileo
Ejemplo de Right-Derivation


( )
<expr>
<expr> <expr>
<expr>
<op>
Produccin: <expr> ( <expr> )
String: <expr> <op> ( <expr> )
Oscar Bonilla 95 Universidad Galileo
Ejemplo de Right-Derivation


( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> ( <expr> <op> <expr> )
Oscar Bonilla 96 Universidad Galileo
Ejemplo de Right-Derivation


num
( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> num
String: <expr> <op> ( <expr> <op> num )
Oscar Bonilla 97 Universidad Galileo
Ejemplo de Right-Derivation


num
+
( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <op> +
String: <expr> <op> ( <expr> + num )
Oscar Bonilla 98 Universidad Galileo
Ejemplo de Right-Derivation


num num
+
( )
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> num
String: <expr> <op> ( num + num )
Oscar Bonilla 99 Universidad Galileo
Ejemplo de Right-Derivation


num num
+
( ) *
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <op> *
String: <expr> * ( num + num )
Oscar Bonilla 100 Universidad Galileo
Ejemplo de Right-Derivation


num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>
Produccin: <expr> num
String: num * ( num + num )
Oscar Bonilla 101 Universidad Galileo
Ejemplo de Right-Derivation


num num
+
( ) *
num
<expr>
<expr> <expr>
<expr>
<expr>
<expr>
<op>
<op>

String: num * ( num + num )
Oscar Bonilla 102 Universidad Galileo
Ejemplo de Right-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 103 Universidad Galileo
Top-down vs. Bottom-up Parsing
Normalmente escaneamos de izquierda a
derecha

Left-most derivation refleja top-down parsing
Comenzamos con el smbolo inicial
Terminamos con el string de tokens


Oscar Bonilla 104 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 105 Universidad Galileo
Top-down vs. Bottom-up Parsing
Normalmente escaneamos de izquierda a
derecha

Left-most derivation refleja top-down parsing
Comenzamos con el smbolo inicial
Terminamos con el string de tokens

Right-most derivation refleja bottom-up parsing
Comenzamos con el string de tokens
Terminamos con el smbolo inicial
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
<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 108 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 109 Universidad Galileo
Resumen
Overview de anlisis lxico
Qu es anlisis sintctico?
Gramticas libres de contexto
Derivaciones y Arboles de Parseo
Top-down vs. Bottom-up Parsing
Gramticas Ambiguas
Implementando un Parser
Oscar Bonilla 110 Universidad Galileo
Otro Ejemplo


Entrada:
124 + 23.5 * 86

Token Stream:
num + num * num
Oscar Bonilla 111 Universidad Galileo
Otro Ejemplo


<expr>
Produccin:
String: <expr>
Oscar Bonilla 112 Universidad Galileo
Otro Ejemplo


<expr>
<expr> <expr> <op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> <expr>
Oscar Bonilla 113 Universidad Galileo
Otro Ejemplo


num
<expr>
<expr> <expr> <op>
Produccin: <expr> <num>
String: num <op> <expr>
Oscar Bonilla 114 Universidad Galileo
Otro Ejemplo


+
num
<expr>
<expr> <expr> <op>
Produccin: <op> +
String: num + <expr>
Oscar Bonilla 115 Universidad Galileo
Otro Ejemplo


Produccin: <expr> <expr> <op> <expr>
String: num + <expr> <op> <expr>
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
<op>
Oscar Bonilla 116 Universidad Galileo
Otro Ejemplo


Produccin: <expr> num
String: num + num <op> <expr>
num
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
<op>
Oscar Bonilla 117 Universidad Galileo
Otro Ejemplo


num
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
Produccin: <op> *
String: num + num * <expr>
*
<op>
Oscar Bonilla 118 Universidad Galileo
Otro Ejemplo


num num
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
Produccin: <expr> num
String: num + num * num
*
<op>
Oscar Bonilla 119 Universidad Galileo
Otro Ejemplo



String: num + num * num
num num
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
*
<op>
Oscar Bonilla 120 Universidad Galileo
Otro Ejemplo



String: num + num * num

Hay otro orden de derivacin?
Oscar Bonilla 121 Universidad Galileo
Otro Ejemplo


<expr>

String: <expr>
Oscar Bonilla 122 Universidad Galileo
Otro Ejemplo


<expr>
<expr>
<expr>
<op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> <expr>
Oscar Bonilla 123 Universidad Galileo
Otro Ejemplo


num
<expr>
<expr> <expr> <op>
Produccin: <expr> <num>
String: num <op> <expr>
Oscar Bonilla 124 Universidad Galileo
Otro Ejemplo


num
<expr>
<expr> <expr> <op>
Produccin: <expr> <num>
String: num <op> <expr>
Pero tambin podemos usar esta produccin
<expr> <expr> <op> <expr>
Oscar Bonilla 125 Universidad Galileo
Otro Ejemplo


<expr>
<expr> <expr> <op>
Produccin:
String: <expr> <op> <expr>
Pero tambin podemos usar esta produccin
<expr> <expr> <op> <expr>
Oscar Bonilla 126 Universidad Galileo
Otro Ejemplo


<expr>
<expr>
<expr>
<expr> <expr>
<op>
Produccin: <expr> <expr> <op> <expr>
String: <expr> <op> <expr> <op> <expr>
<op>
Oscar Bonilla 127 Universidad Galileo
Otro Ejemplo


num
<expr>
<expr>
<expr>
<expr> <expr>
<op>
Produccin: <expr> <num>
String: num <op> <expr> <op> <expr>
<op>
Oscar Bonilla 128 Universidad Galileo
Otro Ejemplo


num
<expr>
<expr>
<expr>
<expr> <expr>
<op>
Produccin: <op> <+>
String: num + <expr> <op> <expr>
+
<op>
Oscar Bonilla 129 Universidad Galileo
Otro Ejemplo


num num
<expr>
<expr>
<expr>
<expr> <expr>
<op>
Produccin: <expr> <num>
String: num + num <op> <expr>
+
<op>
Oscar Bonilla 130 Universidad Galileo
Otro Ejemplo


num num
*
<expr>
<expr>
<expr>
<expr> <expr>
<op>
Produccin: <op> *
String: num + num * <expr>
+
<op>
Oscar Bonilla 131 Universidad Galileo
Otro Ejemplo


num num
*
num
<expr>
<expr>
<expr>
<expr> <expr>
<op>
Produccin: <expr> <num>
String: num + num * num
+
<op>
Oscar Bonilla 132 Universidad Galileo
Otro Ejemplo


num num
*
num
<expr>
<expr>
<expr>
<expr> <expr>
<op>

String: num + num * num
+
<op>
Oscar Bonilla 133 Universidad Galileo
Mismo string Dos derivaciones



num + num * num
num num
* num
<expr>
<expr>
<expr>
<expr> <expr>
<op>
+
<op>
num num
+
num
<expr>
<expr> <expr>
<expr> <expr>
<op>
*
<op>
124 + (23.5 * 86) = 2145 (124 + 23.5) * 86 = 12685
Oscar Bonilla 134 Universidad Galileo
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
Algunas veces el reescribir la gramtica con
ms no-terminales va a eliminar la ambiguedad
Oscar Bonilla 135 Universidad Galileo
La Gramtica Ambigua
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Oscar Bonilla 136 Universidad Galileo
Eliminando la Ambiguedad
<expr> <expr> + <term>
<expr> <term>
<term> <term> * <unit>
<term> <unit>
<unit> num
<unit> ( <expr> )
<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
<expr> num
<op> +
<op> *
Oscar Bonilla 137 Universidad Galileo
Eliminando la Ambiguedad



String: num + num * num
num
+
<expr>
<term> <expr>
<term> <unit>
*
num
<unit>
<term>
num
<unit>
Oscar Bonilla 138 Universidad Galileo
Primer ejemplo en la nueva gramtica


+
( )
*
num
<term>
<unit> <term>
<expr>
<expr>
<term>
num * ( num + num )
<expr>
<unit>
num
<term>
<unit>
num
<unit>
Oscar Bonilla 139 Universidad Galileo
Pregunta: Es esta gramtica
ambigua?

<stmt> if <expr> then <stlist>
<stmt> if <expr> then <stlist> else <stlist>

Oscar Bonilla 140 Universidad Galileo
Pregunta: Cmo la hacemos no
ambigua?

<stmt> if <expr> then <stlist>
<stmt> if <expr> then <stlist> else <stlist>

Oscar Bonilla 141 Universidad Galileo
Resumen
Overview de anlisis lxico
Qu es anlisis sintctico?
Gramticas libres de contexto
Derivaciones y Arboles de Parseo
Top-down vs. Bottom-up Parsing
Gramticas Ambiguas
Implementando un Parser
Oscar Bonilla 142 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)
Oscar Bonilla 143 Universidad Galileo
Ejemplo de look ahead
Gramtica
<stmt> a <long> b
<stmt> a <long> c
<long> x <long> | x

Input string axxxxxxxxxxxxxxxxx.

Puede que tengamos que ver un montn
de smbolos del input antes de decidirnos
por una produccin

Oscar Bonilla 144 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
Hay varias tcnicas
Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas
Oscar Bonilla 145 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
Hay varias tcnicas
Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas
( )
Oscar Bonilla 146 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
Hay varias tcnicas
Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas

( )
L - parsear de izquierda a derecha
R parsear de derecha a izquierda
Oscar Bonilla 147 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
Hay varias tcnicas
Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas


( )
L - leftmost derivation
R - rightmost derivation
Oscar Bonilla 148 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
Hay varias tcnicas
Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas
( )
Nmero de caracteres de lookahead
Oscar Bonilla 149 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
Hay varias tcnicas
Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas


Ejemplos: LL(0), LR(1)
( )
Oscar Bonilla 150 Universidad Galileo
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
Oscar Bonilla 151 Universidad Galileo
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 152 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

S-ar putea să vă placă și