Está en la página 1de 152

Compiladores

Introduccin al Anlisis Sintctico


Gramticas de Contexto Libre,
Arboles de Parseo y Derivaciones

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

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

Resumen de Anlisis Lxico


El analizador lxico crea tokens a partir de un
character stream
Los tokens se definen usando expresiones
regulares

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

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)*)?

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

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

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

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

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

Entrada y Salida de un Parser


Token Stream
minus_op
left_paren_op
num(123.3)
plus_op
num(23.6)
right_paren_op

Oscar Bonilla

Analizador Sintctico (Parser)

Entrada: - (123.3 + 23.6)

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?

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

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;
}
}
}

Problema de los parntesis balanceados


Ejemplo: {{}{{{}{{}}}}}
Oscar Bonilla

15

Universidad Galileo

Problema de los parntesis


balanceados
Podemos definir esto usando una expresin regular?

Problema de los parntesis


balanceados
Podemos definir esto usando una expresin regular?

NO!

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

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

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

20

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)

Ejemplo de una CFG


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

Oscar Bonilla

22

Universidad Galileo

Ejemplo de una CFG


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

Oscar Bonilla

23

Universidad Galileo

Ejemplo de una CFG


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

Oscar Bonilla

Terminales

24

Universidad Galileo

Ejemplo de una CFG


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

Oscar Bonilla

No-terminales

25

Universidad Galileo

Ejemplo de una CFG


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

Oscar Bonilla

Smbolo de Inicio: <S>

26

Universidad Galileo

Ejemplo de una CFG


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

Oscar Bonilla

Producciones

27

Universidad Galileo

Los lenguajes regulares son un subconjunto


de los lenguajes libres de contexto
Expresin Regular

Gramtica libre de contexto

<A> a

Si p y q son expresiones regulares, usando CFGs <P> y <Q>

pq

<S> <P> <Q>

p|q

<S> <P>
<S> <Q>

p*

<S> <S> <P>


<S>

Los lenguajes regulares son un subconjunto


de los lenguajes libres de contexto
Expresin Regular

Gramtica libre de contexto

Si p es una expresin regular, usando una CFG <P>,


Qu es?

<S> <S> <P>


<S> <P>

???

???

P?
Oscar Bonilla

29

Universidad Galileo

Entonces por qu usar expresiones


regulares?
Separar el anlisis sintctico en partes lxica y nolxica 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

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

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

32

Universidad Galileo

Ejemplo: Una CFG para expresiones


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

Oscar Bonilla

33

Universidad Galileo

Ejemplo: Una CFG para expresiones


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

Oscar Bonilla

34

Universidad Galileo

Ejemplo: Una CFG para expresiones


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

Oscar Bonilla

35

Universidad Galileo

Ejemplo: Una CFG para expresiones


<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
No-terminales
<expr> num
<op> +
<op> *

Oscar Bonilla

36

Universidad Galileo

Ejemplo: Una CFG para expresiones


<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
No-terminales
<expr> num
<op> +
<op> *

Oscar Bonilla

37

Universidad Galileo

Ejemplo: Una CFG para expresiones


<expr> <expr> <op> <expr>
<expr> ( <expr> )
<expr> - <expr>
Smbolo de Inicio:
<expr> num
<expr>
<op> +
<op> *

Oscar Bonilla

38

Universidad Galileo

Ejemplo: Una CFG para expresiones


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

Oscar Bonilla

39

Universidad Galileo

Ejemplo: Una CFG para expresiones


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

Oscar Bonilla

40

Universidad Galileo

Ejemplo: Una CFG para expresiones


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

Oscar Bonilla

41

Universidad Galileo

Pregunta: Cul es el lenguaje


definido por esta CFG?
<S> a<S>a | aa

Oscar Bonilla

42

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

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>

num * ( num + num )


Oscar Bonilla

46

Universidad Galileo

Ejemplo de Derivacin
<expr>

num * ( num + num )


Oscar Bonilla

47

Universidad Galileo

Ejemplo de Derivacin
<expr> <expr><op><expr>
<expr>

num * ( num + num )


Oscar Bonilla

48

Universidad Galileo

Ejemplo de Derivacin
<expr> <expr><op><expr>
<expr>

<expr> <op> <expr>

num * ( num + num )


Oscar Bonilla

49

Universidad Galileo

Ejemplo de Derivacin
<expr>

<expr> <op> <expr>

num * ( num + num )


Oscar Bonilla

50

Universidad Galileo

Ejemplo de Derivacin
<expr>

<expr> <op> <expr>

num * ( num + num )


Oscar Bonilla

51

Universidad Galileo

Ejemplo de Derivacin
<expr> num
<expr>

<expr> <op> <expr>

num * ( num + num )


Oscar Bonilla

52

Universidad Galileo

Ejemplo de Derivacin
<expr> num
<expr>

<expr> <op> <expr>


num <op> <expr>

num * ( num + num )


Oscar Bonilla

53

Universidad Galileo

Ejemplo de Derivacin
<expr>

<expr> <op> <expr>


num <op> <expr>

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

<expr> <op> <expr>


num <op> <expr>

num * ( num + num )


Oscar Bonilla

56

Universidad Galileo

Ejemplo de Derivacin
<op> *
<expr>

<expr> <op> <expr>


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

num * ( num + num )


Oscar Bonilla

57

Universidad Galileo

Ejemplo de Derivacin
<expr>

<expr> <op> <expr>


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

num * ( num + num )


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>)
<expr>

<expr> <op> <expr>


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

num * ( num + num )


Oscar Bonilla

60

Universidad Galileo

Ejemplo de Derivacin
<expr> (<expr>)
<expr>

<expr> <op> <expr>


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

num * ( num + num )


Oscar Bonilla

61

Universidad Galileo

Ejemplo de Derivacin
<expr>

<expr> <op> <expr>


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

num * ( num + num )


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>
<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>
<expr>

<expr> <op> <expr>


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

num * ( num + num )


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 )


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> num
<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> num
<expr>

<expr> <op> <expr>


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


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
<op> +
<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
<op> +
<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

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 )


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> 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 )


Oscar Bonilla

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 )

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


Oscar Bonilla

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

Ejemplo de Arbol de Parseo

<expr>

Oscar Bonilla

80

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr>

<expr> <op> <expr>


<expr>

<expr>

Oscar Bonilla

<op>

<expr>

81

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr>

num
<expr>

<expr>

<op>

<expr>

num

Oscar Bonilla

82

Universidad Galileo

Ejemplo de Arbol de Parseo

<op>

*
<expr>

<expr>

num

Oscar Bonilla

<op>

<expr>

83

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr>

( <expr> )
<expr>

<expr>

num

Oscar Bonilla

<op>

<expr>

<expr>

84

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr>

<expr> <op> <expr>


<expr>

<expr>

num

<op>

<expr>

<expr>

<expr> <op>

Oscar Bonilla

85

)
<expr>

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr>

num
<expr>

<expr>

num

<op>

<expr>

<expr>

<expr> <op>

)
<expr>

num
Oscar Bonilla

86

Universidad Galileo

Ejemplo de Arbol de Parseo

<op>

+
<expr>

<expr>

num

<op>

<expr>

<expr>

<expr> <op>

num
Oscar Bonilla

87

)
<expr>

+
Universidad Galileo

Ejemplo de Arbol de Parseo


<expr>

num
<expr>

<expr>

num

<op>

<expr>

<expr>

<expr> <op>

num
Oscar Bonilla

88

)
<expr>

num
Universidad Galileo

Ejemplo de Arbol de Parseo


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

num

<op>

<expr>

<expr>

<expr> <op>

num
Oscar Bonilla

89

)
<expr>

num
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

90

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

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:

num * ( num + num )


<expr>

<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 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

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

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

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

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

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:

num + num * num


<expr>

<expr>

num

Oscar Bonilla

<op>

<expr>
<expr>

<op>

<expr>

num

num

119

Universidad Galileo

Otro Ejemplo
String:

num + num * num

Hay otro orden de derivacin?

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

Pero tambin podemos usar esta produccin


<expr> <expr> <op> <expr>
Oscar Bonilla

124

Universidad Galileo

Otro Ejemplo
Produccin:
String:
<expr> <op> <expr>
<expr>
<expr>

<op>

<expr>

Pero tambin podemos usar esta produccin


<expr> <expr> <op> <expr>
Oscar Bonilla

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:

num + num * num


<expr>
<expr>

<expr>

<op>

<expr>

num

num

Oscar Bonilla

<op>

<expr>

num

132

Universidad Galileo

Mismo string Dos derivaciones


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

<expr>

num

<expr>
<expr>
<op>

<expr>
<expr>

<expr>

num

num

124 + (23.5 * 86) = 2145

<op>

<op>
<expr>

<expr>
num

num

(124 + 23.5) * 86 = 12685

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

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>

<expr> <op> <expr>


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

Eliminando la Ambiguedad
String:

num + num * num


<expr>

<expr>

<term>

<term>

<term>

<unit>

<unit>

num

num

<unit>

num

Primer ejemplo en la nueva gramtica


<expr>

num * ( num + num )

<term>
<term>
<unit>

num

<unit>

<expr>

(
<expr>

)
<term>

<term>

<unit>

<unit>

num

num

Pregunta: Es esta gramtica


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

Oscar Bonilla

139

Universidad Galileo

Pregunta: Cmo la hacemos no


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

Oscar Bonilla

140

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

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)

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

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

Hay varias tcnicas


Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas

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

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

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

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

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)

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

También podría gustarte