UNIVERSIDAD LATINA (UNILA) ANÁLISIS SINTÁCTICO LE, EI, Profesor Ramón Castro Liceaga
Sintaxis Sintaxis.- La sintaxis es un conjunto de reglas formales que especifican la composición de programas a partir de ciertas unidades de construcción (Caracteres). Semántica.- Especifica el significado de un programa sintácticamente válido escrito en el lenguaje, o es el resultado entendible de la sintaxis. La sintaxis.- Es la agrupa ción los tokens en estructuras sintácticas, muy similar a las oraciones aritmeticas. Para un lenguaje de programación bb * 12 consiste de tres tokens (bb, * y 12) y deben agruparse en una estructura denominada expresión. Mientras que, X1 := a + bb * 12; debe agruparse en una estructura llamada sentencia de asignación que contiene la subestructura expresión.
Análisis Léxico El analizador léxico crea tokens a partir de un character stream (cadena de caracteres) Los tokens se definen usando expresiones regulares Oscar Bonilla 3 Universidad Galileo
Análisis semántico Toma como entrada el árbol de análisis gramatical creado en la fase de análisis sintáctico. Esta fase determina el significado (semántica) del programa mediante la creación de tablas de símbolos, verificando cuales de las variables utilizadas han sido definidas y una infinidad de otras tareas anteriores a la generación de código. Dos de las tareas principales en la fase del análisis semántico son: 1) la verificación estática del programa y 2) la generación de una representación intermedia (RI).
Análisis semántico Es La representación intermedia también denominada lenguaje intermedio o código intermedio (RI, LI p CI), es una forma alternativa para un árbol de análisis gramatical. A veces el analizador gramatical crea su representación intermedia en forma directa; y en ocasiones el árbol de este se convierte a la representación.
Expresiones Regulares, Gramáticas y Lenguajes Una expresión regular puede ser escrita usando: Caracteres en el alfabeto o el código assii 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 6 Universidad Galileo
Función del Análisis Léxico El analizador léxico crea tokens a partir de un character stream o cadena Los tokens se definen usando expresiones regulares Las expresiones regulares pueden mapearse a un Automata 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 7 Universidad Galileo
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 Un analizador sintáctico (o parser) es una de las partes de un compilador que transforma su entrada en un árbol de derivación. Semántica Cuál es el significado de un programa Es más difícil dar una definición matemática Oscar Bonilla 8 Universidad 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 Bonilla 9 Universidad 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 Bonilla 10 Universidad Galileo
Entrada y Salida de un Parser Token Stream Arbol de Parseo N1.- menos_op - ( N2.- Parentesis_izq_op Analizador Sintáctico (Parser) N3.- num(123.3) 123.3 ) N4.- mas_op N3.- num(23.6) + 23.6 N2.- Parentesis_der_op Oscar Bonilla 11
Arbol de Parseo Representación gráfica de la estructura parseada (análisis sintactico) 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 12 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 13 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> Oscar Bonilla 14 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> <expr> <op> <expr> <expr> <expr> <op> <expr> Oscar Bonilla 15 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> num <expr> <expr> <op> <expr> num Oscar Bonilla 16 Universidad Galileo
Ejemplo de Arbol de Parseo <op> ‘*’ <expr> <expr> <op> <expr> num * Oscar Bonilla 17 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> ‘(‘ <expr> ‘)’ <expr> <expr> <op> <expr> <expr> num * ( ) Oscar Bonilla 18 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> <expr> <op> <expr> <expr> <expr> <op> <expr> <expr> num * ( ) <expr> <op> <expr> Oscar Bonilla 19 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> num <expr> <expr> <op> <expr> <expr> num * ( ) <expr> <op> <expr> num Oscar Bonilla 20 Universidad Galileo
Ejemplo de Arbol de Parseo <op> ‘+’ <expr> <expr> <op> <expr> <expr> num * ( ) <expr> <op> <expr> num + Oscar Bonilla 21 Universidad Galileo
Ejemplo de Arbol de Parseo <expr> num <expr> <expr> <op> <expr> <expr> num * ( ) <expr> <op> <expr> num num + Oscar Bonilla 22 Universidad Galileo
Ejemplo de Arbol de Parseo num ‘*’ ‘(‘ num ‘+’ num ‘)’ <expr> <expr> <op> <expr> <expr> num * ( ) <expr> <op> <expr> num num + Oscar Bonilla 23 Universidad Galileo