1 / 152

Intr oducción al Análisis Sintáctico

Intr oducción al Análisis Sintáctico. Gramáticas de Contexto Libre , Arboles de Parseo y Derivaciones. Resumen. Overview del análisis léxico Qué es análisis sintáctico Gramáticas libres de contexto D erivaciones y árboles de parseo Top-down vs. Bottom-up Parsing Grámaticas Ambiguas

piera
Download Presentation

Intr oducción al Análisis Sintáctico

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de ParseoyDerivaciones

  2. 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 Bonilla2Universidad Galileo

  3. Programa (character stream) Token Stream Anatomia de un Compilador Analizador Léxico (Scanner) 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 Bonilla3Universidad 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 Bonilla4Universidad 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 Bonilla5Universidad 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 Bonilla6Universidad 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 Bonilla7Universidad Galileo

  8. 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 Bonilla8Universidad Galileo

  9. 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 Oscar Bonilla9Universidad 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 Bonilla10Universidad 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 Bonilla11Universidad Galileo

  12. Analizador Sintáctico (Parser) - ) ( 123.3 23.6 + Entrada y Salida de un Parser Entrada: - (123.3 + 23.6) Token Stream Arbol de Parseo minus_op left_paren_op num(123.3) plus_op num(23.6) right_paren_op Oscar Bonilla12Universidad 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 Bonilla13Universidad 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 Bonilla14Universidad 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 Bonilla15Universidad Galileo

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

  17. Problema de los paréntesis balanceados • Podemos definir esto usando una expresión regular?NO! Oscar Bonilla17Universidad 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 Bonilla18Universidad 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 Bonilla19Universidad Galileo

  20. 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 Bonilla20Universidad 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 Bonilla21Universidad Galileo

  22. Ejemplo de una CFG <S>  ( <S> ) <S> | ε Oscar Bonilla22Universidad Galileo

  23. Ejemplo de una CFG <S>  ( <S> ) <S> <S>  ε Oscar Bonilla23Universidad Galileo

  24. Ejemplo de una CFG <S>  ( <S> ) <S> <S>  ε Terminales Oscar Bonilla24Universidad Galileo

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

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

  27. Ejemplo de una CFG <S>  ( <S> ) <S> <S>  ε Producciones Oscar Bonilla27Universidad Galileo

  28. 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 sonexpresiones regulares,usando CFGs <P> y <Q> p · q <S>  <P> <Q> p | q <S>  <P> <S>  <Q> p * <S>  <S> <P> <S>  ε Oscar Bonilla28Universidad Galileo

  29. ??? P? Los lenguajes regulares son un subconjunto de los lenguajes libres de contexto Expresión Regular Gramática libre de contexto Si p esuna expresión regular, usando una CFG <P>, Qué es? <S>  <S> <P> <S>  <P> ??? Oscar Bonilla29Universidad 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 Bonilla30Universidad Galileo

  31. 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 Bonilla31Universidad Galileo

  32. 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) • numpara 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 Bonilla32Universidad Galileo

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

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

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

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

  37. Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * No-terminales Oscar Bonilla37Universidad 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 Bonilla38Universidad Galileo

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

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

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

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

  43. 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 Bonilla43Universidad Galileo

  44. 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ónA   Un solo paso de la derivación esA  Oscar Bonilla44Universidad Galileo

  45. Ejemplo de Derivación • Gramática <expr>  <expr><op><expr> | (<expr>) | -<expr> | num <op>  + | * • Entrada 36 * ( 8 + 23.4) • Token Stream num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla45Universidad Galileo

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

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

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

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

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

More Related