1.53k likes | 1.82k Views
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
E N D
Introducción al Análisis Sintáctico Gramáticas de Contexto Libre, Arboles de ParseoyDerivaciones
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Problema de los paréntesis balanceados • Podemos definir esto usando una expresión regular? Oscar Bonilla16Universidad Galileo
Problema de los paréntesis balanceados • Podemos definir esto usando una expresión regular?NO! Oscar Bonilla17Universidad 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 Oscar Bonilla18Universidad Galileo
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
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
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
Ejemplo de una CFG <S> ( <S> ) <S> | ε Oscar Bonilla22Universidad Galileo
Ejemplo de una CFG <S> ( <S> ) <S> <S> ε Oscar Bonilla23Universidad Galileo
Ejemplo de una CFG <S> ( <S> ) <S> <S> ε Terminales Oscar Bonilla24Universidad Galileo
Ejemplo de una CFG <S> (<S> ) <S> <S> ε No-terminales Oscar Bonilla25Universidad Galileo
Ejemplo de una CFG <S> ( <S> ) <S> <S> ε Símbolo de Inicio: <S> Oscar Bonilla26Universidad Galileo
Ejemplo de una CFG <S> ( <S> ) <S> <S> ε Producciones Oscar Bonilla27Universidad 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 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
??? 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
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
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
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
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * Oscar Bonilla33Universidad Galileo
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * Terminales Oscar Bonilla34Universidad Galileo
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * Terminales Oscar Bonilla35Universidad Galileo
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * No-terminales Oscar Bonilla36Universidad Galileo
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * No-terminales Oscar Bonilla37Universidad Galileo
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
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * Producciones Oscar Bonilla39Universidad Galileo
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> <expr> ( <expr> ) <expr> - <expr> <expr> num <op> + <op> * Oscar Bonilla40Universidad Galileo
Ejemplo: Una CFG para expresiones <expr> <expr> <op> <expr> | ( <expr> ) | - <expr> | num <op> + | * Oscar Bonilla41Universidad Galileo
Pregunta: Cuál es el lenguaje definido por esta CFG? <S> a<S>a | aa Oscar Bonilla42Universidad 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 Bonilla43Universidad 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ónA Un solo paso de la derivación esA Oscar Bonilla44Universidad Galileo
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
Ejemplo de Derivación <expr> num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla46Universidad Galileo
Ejemplo de Derivación <expr> num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla47Universidad Galileo
Ejemplo de Derivación <expr> <expr><op><expr> <expr> num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla48Universidad Galileo
Ejemplo de Derivación <expr> <expr><op><expr> <expr> <expr> <op> <expr> num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla49Universidad Galileo
Ejemplo de Derivación <expr> <expr> <op> <expr> num ‘*’ ‘(‘ num ‘+’ num ‘)’ Oscar Bonilla50Universidad Galileo