You are on page 1of 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
Oscar Bonilla

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

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

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

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

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

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

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

10

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


Representacin Intermedia Optimizada

Generador de Cdigo
Cdigo en Assembler
Oscar Bonilla

11

Universidad Galileo

Entrada y Salida de un Parser


Entrada: - (123.3 + 23.6) Analizador Sintctico (Parser)

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

Arbol de Parseo

( )

123.3

23.6

+
Universidad Galileo

Oscar Bonilla

12

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

13

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

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?

Oscar Bonilla

16

Universidad Galileo

Problema de los parntesis balanceados


Podemos definir esto usando una expresin regular?

NO!

Oscar Bonilla

17

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

18

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

19

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

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)

Oscar Bonilla

21

Universidad Galileo

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

Oscar Bonilla

24

Universidad Galileo

Ejemplo de una CFG


<S> ( <S> ) <S> <S>
No-terminales

Oscar Bonilla

25

Universidad Galileo

Ejemplo de una CFG


<S> ( <S> ) <S> <S>
Smbolo de Inicio: <S>

Oscar Bonilla

26

Universidad Galileo

Ejemplo de una CFG


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

Oscar Bonilla

27

Universidad Galileo

Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto


Expresin Regular Gramtica libre de contexto

a
pq p|q

<A> a
<S> <P> <Q> <S> <P> <S> <Q> <S> <S> <P> <S>
28 Universidad Galileo

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

p*
Oscar Bonilla

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?

??? P?
Oscar Bonilla

<S> <S> <P> <S> <P> ???

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

30

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

31

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

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> <expr> num Smbolo de Inicio: <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

Oscar Bonilla

44

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

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

num * ( num + num )


Oscar Bonilla

52

Universidad Galileo

Ejemplo de Derivacin
<expr>
<expr> num <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
<expr>
<op> * <expr> <op> <expr> num <op> <expr>

num * ( num + num )


Oscar Bonilla

56

Universidad Galileo

Ejemplo de Derivacin
<expr>
<op> * <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> <expr><op><expr> <expr> <op> <expr> num <op> <expr> num * <expr> num * ( <expr> )

num * ( num + num )


Oscar Bonilla

64

Universidad Galileo

Ejemplo de Derivacin
<expr>
<expr> <expr><op><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>
<expr> num <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> num <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
<expr>
<op> + <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>
<op> + <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>
<expr> num <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> num <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 )
77 Universidad Galileo

Oscar Bonilla

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 )
78 Universidad Galileo

Oscar Bonilla

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

79

Universidad Galileo

Ejemplo de Arbol de Parseo

<expr>

Oscar Bonilla

80

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr> <expr> <op> <expr>
<expr> <expr> <op> <expr>

Oscar Bonilla

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

num

Oscar Bonilla

83

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr> ( <expr> )
<expr> <expr> <op> <expr> <expr>

num

Oscar Bonilla

84

Universidad Galileo

Ejemplo de Arbol de Parseo


<expr> <expr> <op> <expr>
<expr> <expr> <op> <expr> <expr> <expr> <op> <expr>

num

Oscar Bonilla

85

Universidad Galileo

Ejemplo de Arbol de Parseo


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

num

num
Oscar Bonilla

86

Universidad Galileo

Ejemplo de Arbol de Parseo


<op> +
<expr> <expr> <op> <expr> <expr> <expr> <op> <expr>

num

num
Oscar Bonilla

+
Universidad Galileo

87

Ejemplo de Arbol de Parseo


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

num

num
Oscar Bonilla

num
Universidad Galileo

88

Ejemplo de Arbol de Parseo


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

num

num
Oscar Bonilla

num
Universidad Galileo

89

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

Oscar Bonilla

91

Universidad Galileo

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

Oscar Bonilla

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

Oscar Bonilla

95

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

+
Oscar Bonilla

num
Universidad Galileo

97

Ejemplo de Right-Derivation
Produccin: <expr> num String: <expr> <op> ( num + num )
<expr> <expr> <op> <expr> <expr> <expr> <op> <expr>

num
Oscar Bonilla

num
Universidad Galileo

98

Ejemplo de Right-Derivation
Produccin: <op> * String: <expr> * ( num + num )
<expr> <expr> <op> <expr> <expr> <expr> <op> <expr>

num
Oscar Bonilla

num
Universidad Galileo

99

Ejemplo de Right-Derivation
Produccin: <expr> num String: num * ( num + num )
<expr> <expr> <op> <expr> <expr> <expr> <op> <expr>

num

num
Oscar Bonilla

num
Universidad Galileo

100

Ejemplo de Right-Derivation
String: num * ( num + num )
<expr> <expr> <op> <expr> <expr> <expr> <op> <expr>

num

num
Oscar Bonilla

num
Universidad Galileo

101

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

Oscar Bonilla

103

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

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

105

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

Oscar Bonilla

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

num

Oscar Bonilla

114

Universidad Galileo

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

num

<op>

Oscar Bonilla

115

Universidad Galileo

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

num

<op>

num

Oscar Bonilla

116

Universidad Galileo

Otro Ejemplo
Produccin: <op> * String: num + num * <expr>
<expr> <expr> <op> <expr> <expr> <expr>

num

<op>

num

Oscar Bonilla

117

Universidad Galileo

Otro Ejemplo
Produccin: <expr> num String: num + num * num
<expr> <expr> <op> <expr> <expr> <expr>

num

<op>

num

num

Oscar Bonilla

118

Universidad Galileo

Otro Ejemplo
String: num + num * num
<expr> <expr> <op> <expr> <expr> <expr>

num

<op>

num

num

Oscar Bonilla

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

<expr>

Oscar Bonilla

122

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

<expr>

<op>

Oscar Bonilla

126

Universidad Galileo

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

<expr>

<op>

num

Oscar Bonilla

127

Universidad Galileo

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

<expr>

<op>

num

Oscar Bonilla

128

Universidad Galileo

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

<expr>

<op>

num

num

Oscar Bonilla

129

Universidad Galileo

Otro Ejemplo
Produccin: <op> * String: num + num * <expr>
<expr> <expr> <expr> <expr> <op>

<expr>

<op>

num

num

Oscar Bonilla

130

Universidad Galileo

Otro Ejemplo
Produccin: <expr> <num> String: num + num * num
<expr> <expr> <expr> <expr> <op>

<expr>

<op>

num

num

num

Oscar Bonilla

131

Universidad Galileo

Otro Ejemplo
String: num + num * num
<expr> <expr> <expr> <expr> <op>

<expr>

<op>

num

num

num

Oscar Bonilla

132

Universidad Galileo

Mismo string Dos derivaciones


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

num

num

num

num

124 + (23.5 * 86) = 2145

(124 + 23.5) * 86 = 12685

Oscar Bonilla

133

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

134

Universidad Galileo

La Gramtica Ambigua
<expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> *

Oscar Bonilla

135

Universidad Galileo

Eliminando la Ambiguedad
<expr> <expr> + <term> <expr> <term> <term> <term> * <unit> <term> <unit> <expr> <unit> num <expr> <unit> ( <expr> )

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

Oscar Bonilla

136

Eliminando la Ambiguedad
String: num + num * num
<expr> <expr> <term>

+
<term>

<term> <unit>

<unit>

<unit>

num

num
Oscar Bonilla

num
137 Universidad Galileo

Primer ejemplo en la nueva gramtica


<expr> <term> <term> <unit>

num * ( num + num )


<unit>

* (
<expr>

<expr> <term>

num

+
<term> <unit> <unit>

num

num
Oscar Bonilla

138

Universidad Galileo

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)

Oscar Bonilla

142

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

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

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

(
L - parsear de izquierda a derecha R parsear de derecha a izquierda
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 - leftmost derivation R - rightmost derivation
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

(
Nmero de caracteres de lookahead

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

(
Ejemplos: LL(0), LR(1)
Oscar Bonilla

149

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

150

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

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

Oscar Bonilla

152

Universidad Galileo