La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones.

Presentaciones similares


Presentación del tema: "Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones."— Transcripción de la presentación:

1 Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones

2 Oscar Bonilla 2Universidad Galileo Resumen Overview del análisis léxico Qué es análisis sintáctico Gramáticas libres de contexto Derivaciones y árboles de parseo Top-down vs. Bottom-up Parsing Grámaticas Ambiguas Implementando un Parser

3 Oscar Bonilla 3Universidad Galileo Anatomia de un Compilador Optimizador Generador de Código Representación Intermedia Optimizada Código en Assembler Generador de Código Intermedio Representación Intermedia Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream)

4 Oscar Bonilla 4Universidad Galileo Resumen de Análisis Léxico El analizador léxico crea tokens a partir de un character stream Los tokens se definen usando expresiones regulares

5 Oscar Bonilla 5Universidad Galileo Expresiones Regulares, Gramáticas y Lenguajes Una expresión regular puede ser escrita usando: –Caracteres en el alfabeto –Operadores de expresiones regulares: ‘*’ ‘·’ ‘|’ ‘+’ ‘?’ ‘(‘ ‘)’ –Ejemplo: (-| ε) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)? Un lenguaje regular es un lenguaje definido por una expresión regular

6 Oscar Bonilla 6Universidad Galileo Expresiones Regulares, Gramáticas y Lenguajes Qué hay acerca de las variables simbólicas? –Ejemplo: num = 0|1|2|3|4|5|6|7|8|9 posint = num · num* int = (ε | -) · posint real = int · (ε | (. · posint)) Sólo son una abreviación, llamada “syntactic sugar” –Ejemplo: (-| ε) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?

7 Oscar Bonilla 7Universidad Galileo Resumen de Análisis Léxico El analizador léxico crea tokens a partir de un character stream Los tokens se definen usando expresiones regulares Las expresiones regulares pueden mapearse a un Automaton Finito No Determinístico (NFA) –Por construcción simple NFA se transforma a un DFA –Algoritmo de transformación –Ejecutar un DFA es fácil

8 Oscar Bonilla 8Universidad Galileo Resumen Overview del análisis léxico Qúe es análisis sintáctico Gramáticas libres de contexto Derivación y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

9 Oscar Bonilla 9Universidad Galileo Sintaxis y Semántica de un Lenguaje de Programación? Sintaxis –Como se ve un programa –Representación textual o estructura –Es posible una definición matemática precisa Semántica –Cuál es el significado de un programa –Es más difícil dar una definición matemática

10 Oscar Bonilla 10Universidad Galileo Por qué hacer análisis sintáctico? Podemos proveer una definición precisa y fácil de entender Una gramática apropiada imparte estructura a un lenguaje de programación Podemos construir automáticamente un parser que determine si el programa es sintácticamente correcto Ayuda en el proceso de traducción Fácil modificar/añadir al lenguaje

11 Oscar Bonilla 11Universidad Galileo Anatomia de un Compilador Optimizador de Código Generador de Código Representación Intermedia Optimizada Código en Assembler Generador de Código Intermedio Representación Intermedia Analizador Léxico (Scanner) Analizador Sintáctico (Parser) Token Stream Arbol de Parseo Programa (character stream)

12 Oscar Bonilla 12Universidad Galileo Entrada y Salida de un Parser - ( ) 123.3 23.6 + minus_op left_paren_op num(123.3) plus_op num(23.6) right_paren_op Token StreamArbol de Parseo Entrada: - (123.3 + 23.6) Analizador Sintáctico (Parser)

13 Oscar Bonilla 13Universidad Galileo Definición de la Sintaxis Tenemos que proveer una definición precisa y fácil de entender de la sintaxis del lenguaje de programación Podemos usar expresiones regulares? –Podemos usar un lenguaje regular para definir un lenguaje de programación?

14 Oscar Bonilla 14Universidad Galileo Ejemplo: Scope Jerárquico Procedure foo(integer m, integer n, integer j) { for i = 1 to n do { if (i == j) { j = j + 1; m = i*j; } for k = i to n { m = m + k; }

15 Oscar Bonilla 15Universidad Galileo Ejemplo: Scope Jerárquico Procedure foo(integer m, integer n, integer j) { for i = 1 to n do { if (i == j) { j = j + 1; m = i*j; } for k = i to n { m = m + k; } Problema de los paréntesis balanceados –Ejemplo: {{}{{{}{{}}}}}

16 Oscar Bonilla 16Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular?

17 Oscar Bonilla 17Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular? NO!

18 Oscar Bonilla 18Universidad Galileo Problema de los paréntesis balanceados Podemos definir esto usando una expresión regular? NO! Intuición Número de paréntesis abiertos debe ser igual a número de paréntesis cerrados Necesitamos mantener un conteo o necesitamos recursión Además: NFA’s y DFA’s no pueden ejecutar conteo sin límites

19 Oscar Bonilla 19Universidad Galileo Problema de los paréntesis balanceados Hay alguna gramática que defina esto?  ( ) | ε La definición es recursiva Esta es una gramática libre de contexto –Es más expresiva que las expresiones regulares

20 Oscar Bonilla 20Universidad Galileo Resumen Overview del análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivación y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

21 Oscar Bonilla 21Universidad Galileo Definiendo Context-Free Grammars (CFGs) Terminales –Símbolos para strings o tokens No terminales –Variables sintácticas Símbolo de Inicio –Un no-terminal especial es designado Producciones –La forma en que los terminales y no-terminales son combinados para formar strings –Un no-terminal en el lado izquierdo (LHS) y un string de terminales y no-terminales en el lado derecho (RHS)

22 Oscar Bonilla 22Universidad Galileo Ejemplo de una CFG  ( ) | ε

23 Oscar Bonilla 23Universidad Galileo Ejemplo de una CFG  ( )  ε

24 Oscar Bonilla 24Universidad Galileo Ejemplo de una CFG  ( )  ε Terminales

25 Oscar Bonilla 25Universidad Galileo Ejemplo de una CFG  ( )  ε No-terminales

26 Oscar Bonilla 26Universidad Galileo Ejemplo de una CFG  ( )  ε Símbolo de Inicio:

27 Oscar Bonilla 27Universidad Galileo Ejemplo de una CFG  ( )  ε Producciones

28 Oscar Bonilla 28Universidad Galileo Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto a Expresión RegularGramática libre de contexto  a p · q  Si p y q son expresiones regulares, usando CFGs y p | q  p *   ε

29 Oscar Bonilla 29Universidad Galileo Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto ???  Si p es una expresión regular, usando una CFG, Qué es? Expresión RegularGramática libre de contexto P? ???

30 Oscar Bonilla 30Universidad Galileo Entonces por qué usar expresiones regulares? Separar el análisis sintáctico en partes léxica y no- léxica es una buena modularización Las reglas léxicas son simples y pueden ser expresadas usando expresiones regulares Las expresiones regulares son más concisas Las implementaciones de analizadores léxicos para expresiones regulares son más eficientes

31 Oscar Bonilla 31Universidad Galileo Creando una CFG Tenemos que crear una CFG a partir de las definiciones del lenguaje Hay muchas cosas involucradas –Vamos a ver algunas de ellas en clase Veamos un lenguaje simple

32 Oscar Bonilla 32Universidad Galileo Ejemplo: Una CFG para expresiones Expresiones aritméticas simples con + y * –8.2 + 35.6 –8.32 + 86 * 45.3 –(6.001 + 6.004) * (6.035 * -(6.042 + 6.046)) Terminales (o tokens) –num para todos los números –plus_op (‘+’), minus_op (‘-’), times_op(‘*’), left_paren_op(‘(‘), right_paren_op(‘)’) Cuál es la gramática para todas las expresiones posibles?

33 Oscar Bonilla 33Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  *

34 Oscar Bonilla 34Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Terminales

35 Oscar Bonilla 35Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Terminales

36 Oscar Bonilla 36Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * No-terminales

37 Oscar Bonilla 37Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * No-terminales

38 Oscar Bonilla 38Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Símbolo de Inicio:

39 Oscar Bonilla 39Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  * Producciones

40 Oscar Bonilla 40Universidad Galileo Ejemplo: Una CFG para expresiones   ( )  -  num  +  *

41 Oscar Bonilla 41Universidad Galileo Ejemplo: Una CFG para expresiones  | ( ) | - | num  + | *

42 Oscar Bonilla 42Universidad Galileo Pregunta: Cuál es el lenguaje definido por esta CFG?  a a | aa

43 Oscar Bonilla 43Universidad Galileo Resumen Overview de análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

44 Oscar Bonilla 44Universidad Galileo Derivaciones Cómo mostramos que una secuencia de tokens es aceptada por una CFG? Una producción es usada para derivar una secuencia de tokens a partir del símbolo de inicio Dados los strings ,  y  y una producción A   Un solo paso de la derivación es  A   

45 Oscar Bonilla 45Universidad Galileo Ejemplo de Derivación Gramática  | ( ) | - | num  + | * Entrada 36 * ( 8 + 23.4) Token Stream num ‘*’ ‘(‘ num ‘+’ num ‘)’

46 Oscar Bonilla 46Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’

47 Oscar Bonilla 47Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’

48 Oscar Bonilla 48Universidad Galileo Ejemplo de Derivación num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

49 Oscar Bonilla 49Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

50 Oscar Bonilla 50Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’

51 Oscar Bonilla 51Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’

52 Oscar Bonilla 52Universidad Galileo Ejemplo de Derivación  num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

53 Oscar Bonilla 53Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

54 Oscar Bonilla 54Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’

55 Oscar Bonilla 55Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’

56 Oscar Bonilla 56Universidad Galileo Ejemplo de Derivación   num num ‘*’ ‘(‘ num ‘+’ num ‘)’  *

57 Oscar Bonilla 57Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  *

58 Oscar Bonilla 58Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

59 Oscar Bonilla 59Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

60 Oscar Bonilla 60Universidad Galileo Ejemplo de Derivación   num  num ‘*’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  ( )

61 Oscar Bonilla 61Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  ( )

62 Oscar Bonilla 62Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

63 Oscar Bonilla 63Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

64 Oscar Bonilla 64Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

65 Oscar Bonilla 65Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’ 

66 Oscar Bonilla 66Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

67 Oscar Bonilla 67Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

68 Oscar Bonilla 68Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

69 Oscar Bonilla 69Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

70 Oscar Bonilla 70Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

71 Oscar Bonilla 71Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

72 Oscar Bonilla 72Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  +

73 Oscar Bonilla 73Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  +

74 Oscar Bonilla 74Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

75 Oscar Bonilla 75Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

76 Oscar Bonilla 76Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

77 Oscar Bonilla 77Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’  num

78 Oscar Bonilla 78Universidad Galileo Ejemplo de Derivación   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’ num ‘*’ ‘(‘ num ‘+’ num ‘)’

79 Oscar Bonilla 79Universidad Galileo Arbol de Parseo Representación gráfica de la estructura parseada Muestra la secuencia de derivaciones efectuada –Nodos internos son no-terminales –Hojas son terminales –Cada nodo padre es el lado izquierdo (LHS) y los hijos son el lado derecho (RHS) de una producción

80 Oscar Bonilla 80Universidad Galileo Ejemplo de Arbol de Parseo

81 Oscar Bonilla 81Universidad Galileo Ejemplo de Arbol de Parseo 

82 Oscar Bonilla 82Universidad Galileo Ejemplo de Arbol de Parseo  num num

83 Oscar Bonilla 83Universidad Galileo Ejemplo de Arbol de Parseo  ‘*’ * num

84 Oscar Bonilla 84Universidad Galileo Ejemplo de Arbol de Parseo  ‘(‘ ‘)’ ()* num

85 Oscar Bonilla 85Universidad Galileo Ejemplo de Arbol de Parseo  ()* num

86 Oscar Bonilla 86Universidad Galileo Ejemplo de Arbol de Parseo  num num ()*

87 Oscar Bonilla 87Universidad Galileo Ejemplo de Arbol de Parseo  ‘+’ num + ()*

88 Oscar Bonilla 88Universidad Galileo Ejemplo de Arbol de Parseo  num num + ()*

89 Oscar Bonilla 89Universidad Galileo Ejemplo de Arbol de Parseo num + ()* num ‘*’ ‘(‘ num ‘+’ num ‘)’

90 Oscar Bonilla 90Universidad Galileo Resumen Overview del análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

91 Oscar Bonilla 91Universidad Galileo Derivaciones left-most vs. right-most Leftmost derivation –En el string, encontramos el no-terminal de más a la izquierda y le aplicamos una producción –El ejemplo anterior fue de una leftmos derivation Rightmost derivation –Encontramos el no-terminal de más a la derecha y le aplicamos una producción

92 Oscar Bonilla 92Universidad Galileo Ejemplo de Right-Derivation Producción: String:

93 Oscar Bonilla 93Universidad Galileo Ejemplo de Right-Derivation Producción:  String:

94 Oscar Bonilla 94Universidad Galileo Ejemplo de Right-Derivation () Producción:  ‘(‘ ‘)’ String: ‘(‘ ‘)’

95 Oscar Bonilla 95Universidad Galileo Ejemplo de Right-Derivation () Producción:  String: ‘(‘ ‘)’

96 Oscar Bonilla 96Universidad Galileo Ejemplo de Right-Derivation num () Producción:  num String: ‘(‘ num ‘)’

97 Oscar Bonilla 97Universidad Galileo Ejemplo de Right-Derivation num + () Producción:  ‘+’ String: ‘(‘ ‘+’ num ‘)’

98 Oscar Bonilla 98Universidad Galileo Ejemplo de Right-Derivation num + () Producción:  num String: ‘(‘ num ‘+’ num ‘)’

99 Oscar Bonilla 99Universidad Galileo Ejemplo de Right-Derivation num + ()* Producción:  ‘*’ String: ‘*’ ‘(‘ num ‘+’ num ‘)’

100 Oscar Bonilla 100Universidad Galileo Ejemplo de Right-Derivation num + ()* Producción:  num String: num ‘*’ ‘(‘ num ‘+’ num ‘)’

101 Oscar Bonilla 101Universidad Galileo Ejemplo de Right-Derivation num + ()* String: num ‘*’ ‘(‘ num ‘+’ num ‘)’

102 Oscar Bonilla 102Universidad Galileo Ejemplo de Right-Derivation   ‘(‘ ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘+’ num ‘)’’  ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

103 Oscar Bonilla 103Universidad Galileo Top-down vs. Bottom-up Parsing Normalmente escaneamos de izquierda a derecha Left-most derivation refleja top-down parsing –Comenzamos con el símbolo inicial –Terminamos con el string de tokens

104 Oscar Bonilla 104Universidad Galileo Top-down Parsing Left-most derivation   num  num ‘*’  num ‘*’ ‘(‘ ‘)’  num ‘*’ ‘(‘ num ‘)’  num ‘*’ ‘(‘ num ‘+’ ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

105 Oscar Bonilla 105Universidad Galileo Top-down vs. Bottom-up Parsing Normalmente escaneamos de izquierda a derecha Left-most derivation refleja top-down parsing –Comenzamos con el símbolo inicial –Terminamos con el string de tokens Right-most derivation refleja bottom-up parsing –Comenzamos con el string de tokens –Terminamos con el símbolo inicial

106 Oscar Bonilla 106Universidad Galileo Bottom-up Parsing Right-most derivation   ‘(‘ ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘+’ num ‘)’’  ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

107 Oscar Bonilla 107Universidad Galileo Bottom-up Parsing Right-most derivation   ‘(‘ ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘+’ num ‘)’’  ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  num ‘*’ ‘(‘ num ‘+’ num ‘)’

108 Oscar Bonilla 108Universidad Galileo Bottom-up Parsing Right-most derivation  num ‘*’ ‘(‘ num ‘+’ num ‘)’  ‘*’ ‘(‘ num ‘+’ num ‘)’  ‘(‘ num ‘+’ num ‘)’  ‘(‘ ‘+’ num ‘)’  ‘(‘ num ‘)’  ‘(‘ ‘)’ 

109 Oscar Bonilla 109Universidad Galileo Resumen Overview de análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

110 Oscar Bonilla 110Universidad Galileo Otro Ejemplo Entrada: 124 + 23.5 * 86 Token Stream: num ‘+’ num ‘*’ num

111 Oscar Bonilla 111Universidad Galileo Otro Ejemplo Producción: String:

112 Oscar Bonilla 112Universidad Galileo Otro Ejemplo Producción:  String:

113 Oscar Bonilla 113Universidad Galileo Otro Ejemplo num Producción:  String: num

114 Oscar Bonilla 114Universidad Galileo Otro Ejemplo + num Producción:  ‘+’ String: num ‘+’

115 Oscar Bonilla 115Universidad Galileo Otro Ejemplo Producción:  String: num ‘+’ + num

116 Oscar Bonilla 116Universidad Galileo Otro Ejemplo Producción:  num String: num ‘+’ num num +

117 Oscar Bonilla 117Universidad Galileo Otro Ejemplo num + Producción:  ‘*’ String: num ‘+’ num ‘*’ *

118 Oscar Bonilla 118Universidad Galileo Otro Ejemplo num + Producción:  num String: num ‘+’ num ‘*’ num *

119 Oscar Bonilla 119Universidad Galileo Otro Ejemplo String: num ‘+’ num ‘*’ num num + *

120 Oscar Bonilla 120Universidad Galileo Otro Ejemplo String: num ‘+’ num ‘*’ num Hay otro orden de derivación?

121 Oscar Bonilla 121Universidad Galileo Otro Ejemplo String:

122 Oscar Bonilla 122Universidad Galileo Otro Ejemplo Producción:  String:

123 Oscar Bonilla 123Universidad Galileo Otro Ejemplo num Producción:  String: num

124 Oscar Bonilla 124Universidad Galileo Otro Ejemplo num Producción:  String: num Pero también podemos usar esta producción 

125 Oscar Bonilla 125Universidad Galileo Otro Ejemplo Producción: String: Pero también podemos usar esta producción 

126 Oscar Bonilla 126Universidad Galileo Otro Ejemplo Producción:  String:

127 Oscar Bonilla 127Universidad Galileo Otro Ejemplo num Producción:  String: num

128 Oscar Bonilla 128Universidad Galileo Otro Ejemplo num Producción:  String: num ‘+’ +

129 Oscar Bonilla 129Universidad Galileo Otro Ejemplo num Producción:  String: num ‘+’ num +

130 Oscar Bonilla 130Universidad Galileo Otro Ejemplo num * Producción:  ‘*’ String: num ‘+’ num ‘*’ +

131 Oscar Bonilla 131Universidad Galileo Otro Ejemplo num * Producción:  String: num ‘+’ num ‘*’ num +

132 Oscar Bonilla 132Universidad Galileo Otro Ejemplo num * String: num ‘+’ num ‘*’ num +

133 Oscar Bonilla 133Universidad Galileo Mismo string – Dos derivaciones num ‘+’ num ‘*’ num num * + num + * 124 + (23.5 * 86) = 2145(124 + 23.5) * 86 = 12685

134 Oscar Bonilla 134Universidad Galileo La Gramática es Ambigua Aplicar diferentes ordenes de derivación produce árboles de parseo diferentes Esto no es bueno! –Lleva a resultados ambiguos –Muy probablemente va a producir resultados inesperados Algunas veces el reescribir la gramática con más no-terminales va a eliminar la ambiguedad

135 Oscar Bonilla 135Universidad Galileo La Gramática Ambigua   ( )  -  num  +  *

136 Oscar Bonilla 136Universidad Galileo Eliminando la Ambiguedad  +   *   num  ( )   ( )  -  num  +  *

137 Oscar Bonilla 137Universidad Galileo Eliminando la Ambiguedad String: num ‘+’ num ‘*’ num num + * num num

138 Oscar Bonilla 138Universidad Galileo Primer ejemplo en la nueva gramática + () * num num ‘*’ ‘(‘ num ‘+’ num ‘)’ num num

139 Oscar Bonilla 139Universidad Galileo Pregunta: Es esta gramática ambigua?  if then  if then else

140 Oscar Bonilla 140Universidad Galileo Pregunta: Cómo la hacemos no ambigua?  if then  if then else

141 Oscar Bonilla 141Universidad Galileo Resumen Overview de análisis léxico Qué es análisis sintáctico? Gramáticas libres de contexto Derivaciones y Arboles de Parseo Top-down vs. Bottom-up Parsing Gramáticas Ambiguas Implementando un Parser

142 Oscar Bonilla 142Universidad Galileo Implementando un Parser La implementación de un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir la producción correcta sin ver que viene en el input (looking ahead)

143 Oscar Bonilla 143Universidad Galileo Ejemplo de look ahead Gramática  a b  a c  x | x Input string “axxxxxxxxxxxxxxxxx…….” Puede que tengamos que ver un montón de símbolos del input antes de decidirnos por una producción

144 Oscar Bonilla 144Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas

145 Oscar Bonilla 145Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas ()

146 Oscar Bonilla 146Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas () L - parsear de izquierda a derecha R – parsear de derecha a izquierda

147 Oscar Bonilla 147Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas () L - leftmost derivation R - rightmost derivation

148 Oscar Bonilla 148Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas () Número de caracteres de lookahead

149 Oscar Bonilla 149Universidad Galileo Implementando un Parser Implementar un parser para algunas CFG’s puede ser muy difícil –Tenemos que ver el input y elegir una producción –No podemos elegir una producción sin look ahead Hay varias técnicas –Cada una puede manejar algunas CFG’s –Categorización de las técnicas –Ejemplos: LL(0), LR(1) ()

150 Oscar Bonilla 150Universidad Galileo Siguiente Clase Cómo implementar un Parser Cómo construir un parser engine para un parser shift-reduce Vamos a ver –LR(0) –LR(1) –LALR(1) Parser Engine

151 Oscar Bonilla 151Universidad Galileo Resumen Qué es análisis sintáctico? Diferencia entre análisis léxico y análisis sintáctico Gramáticas libres de contexto Arboles de Parseo Derivaciones left-most y right-most Top-down and bottom-up parsing Gramáticas Ambiguas Implementación de Parsers

152 Oscar Bonilla 152Universidad Galileo Grupos Ya tienen que tener grupos Si no tienen grupo todavía, hagánlo! Los listados de grupos van a estar en el Web Si no están en un grupo en el Web hablen con Andreaq


Descargar ppt "Compiladores Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de Parseo y Derivaciones."

Presentaciones similares


Anuncios Google