La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Introducción al Análisis Sintáctico

Presentaciones similares


Presentación del tema: "Introducción al Análisis Sintáctico"— Transcripción de la presentación:

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

2 Oscar Bonilla 2 Universidad 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 Oscar Bonilla Universidad Galileo

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

4 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 Oscar Bonilla Universidad Galileo

5 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 Oscar Bonilla Universidad Galileo

6 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)*)? Oscar Bonilla Universidad Galileo

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

8 Oscar Bonilla 8 Universidad 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 Oscar Bonilla Universidad Galileo

9 Sintaxis y Semántica de un Lenguaje de Programación?
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 Oscar Bonilla Universidad Galileo

10 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 Oscar Bonilla Universidad Galileo

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

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

13 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? Oscar Bonilla Universidad Galileo

14 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; Oscar Bonilla Universidad Galileo

15 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: {{}{{{}{{}}}}} Oscar Bonilla Universidad Galileo

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

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

18 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 Oscar Bonilla Universidad Galileo

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

20 Oscar Bonilla 20 Universidad 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 Oscar Bonilla Universidad Galileo

21 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) Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

28 Oscar Bonilla 28 Universidad Galileo
Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto Expresión Regular Gramática libre de contexto a <A>  a Si p y q son expresiones regulares, usando CFGs <P> y <Q> p · q <S>  <P> <Q> p | q <S>  <P> <S>  <Q> p * <S>  <S> <P> <S>  ε Oscar Bonilla Universidad Galileo

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

30 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 Oscar Bonilla Universidad Galileo

31 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 Universidad Galileo

32 Ejemplo: Una CFG para expresiones
Expresiones aritméticas simples con + y * * 45.3 ( ) * (6.035 * -( )) 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? Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

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

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

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

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

43 Oscar Bonilla 43 Universidad 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 Oscar Bonilla Universidad Galileo

44 Oscar Bonilla 44 Universidad 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   Oscar Bonilla Universidad Galileo

45 Oscar Bonilla 45 Universidad Galileo
Ejemplo de Derivación Gramática <expr>  <expr><op><expr> | (<expr>) | -<expr> | num <op>  + | * Entrada * ( ) Token Stream num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

69 Oscar Bonilla 69 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

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

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

72 Oscar Bonilla 72 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

73 Oscar Bonilla 73 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

74 Oscar Bonilla 74 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

75 Oscar Bonilla 75 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

76 Oscar Bonilla 76 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

77 Oscar Bonilla 77 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

78 Oscar Bonilla 78 Universidad Galileo
Ejemplo de Derivación <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 Universidad Galileo

79 Oscar Bonilla 79 Universidad 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 Oscar Bonilla Universidad Galileo

80 Ejemplo de Arbol de Parseo
<expr> Oscar Bonilla Universidad Galileo

81 Ejemplo de Arbol de Parseo
<expr>  <expr> <op> <expr> <expr> <expr> <op> <expr> Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

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

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

90 Oscar Bonilla 90 Universidad 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 Oscar Bonilla Universidad Galileo

91 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 Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

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

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

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

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

102 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 Universidad Galileo

103 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 Oscar Bonilla Universidad Galileo

104 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 Universidad Galileo

105 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 Oscar Bonilla Universidad Galileo

106 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 Universidad Galileo

107 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 Universidad Galileo

108 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 Universidad Galileo

109 Oscar Bonilla 109 Universidad 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 Oscar Bonilla Universidad Galileo

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

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

112 Oscar Bonilla 112 Universidad Galileo
Otro Ejemplo Producción: <expr>  <expr> <op> <expr> String: <expr> <op> <expr> <expr> <expr> <op> <expr> Oscar Bonilla Universidad Galileo

113 Oscar Bonilla 113 Universidad Galileo
Otro Ejemplo Producción: <expr>  <num> String: num <op> <expr> <expr> <expr> <op> <expr> num Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

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

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

122 Oscar Bonilla 122 Universidad Galileo
Otro Ejemplo Producción: <expr>  <expr> <op> <expr> String: <expr> <op> <expr> <expr> <expr> <op> <expr> Oscar Bonilla Universidad Galileo

123 Oscar Bonilla 123 Universidad Galileo
Otro Ejemplo Producción: <expr>  <num> String: num <op> <expr> <expr> <expr> <op> <expr> num Oscar Bonilla Universidad Galileo

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

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

126 Oscar Bonilla 126 Universidad Galileo
Otro Ejemplo Producción: <expr>  <expr> <op> <expr> String: <expr> <op> <expr> <op> <expr> <expr> <expr> <op> <expr> <expr> <expr> <op> Oscar Bonilla Universidad Galileo

127 Oscar Bonilla 127 Universidad Galileo
Otro Ejemplo Producción: <expr>  <num> String: num <op> <expr> <op> <expr> <expr> <expr> <op> <expr> <expr> <expr> <op> num Oscar Bonilla Universidad Galileo

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

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

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

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

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

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

134 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 Oscar Bonilla Universidad Galileo

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

136 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 Universidad Galileo

137 Eliminando la Ambiguedad
String: num ‘+’ num ‘*’ num <expr> <expr> + <term> <term> <term> <unit> * <unit> <unit> num num num Oscar Bonilla Universidad Galileo

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

139 Pregunta: Es esta gramática ambigua?
<stmt>  if <expr> then <stlist> <stmt>  if <expr> then <stlist> else <stlist> Oscar Bonilla Universidad Galileo

140 Pregunta: Cómo la hacemos no ambigua?
<stmt>  if <expr> then <stlist> <stmt>  if <expr> then <stlist> else <stlist> Oscar Bonilla Universidad Galileo

141 Oscar Bonilla 141 Universidad 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 Oscar Bonilla Universidad Galileo

142 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) Oscar Bonilla Universidad Galileo

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

144 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 Oscar Bonilla Universidad Galileo

145 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 ( ) Oscar Bonilla Universidad Galileo

146 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 Oscar Bonilla Universidad Galileo

147 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 Oscar Bonilla Universidad Galileo

148 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 Oscar Bonilla Universidad Galileo

149 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) ( ) Oscar Bonilla Universidad Galileo

150 Oscar Bonilla 150 Universidad 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 Oscar Bonilla Universidad Galileo

151 Oscar Bonilla 151 Universidad 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 Oscar Bonilla Universidad Galileo

152 Oscar Bonilla 152 Universidad 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 Oscar Bonilla Universidad Galileo


Descargar ppt "Introducción al Análisis Sintáctico"

Presentaciones similares


Anuncios Google