Tema 5. Análisis semántico

Documentos relacionados
Tema 4: Análisis sintáctico ascendente. Análisis sintáctico ascendente: un ejemplo

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Tema 3. Análisis sintáctico descendente

Conceptos básicos sobre gramáticas

16 Análisis sintáctico I

UNIDAD V. Analisis Semantico. 5.1 Introduccion. Analizador Semántico. Verifica que el significado de las construcciones del lenguaje tengan sentido.

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4

Tema: Análisis Sintáctico

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

Generación de Código Intermedio

Elementos de un programa en C

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

Programación. Test Autoevaluación Tema 3

Unidad I: Análisis semántico

Capítulo 5: Traducción Dirigida por Sintaxis

ANÁLISIS SEMÁNTICO. Especificación formal: Semántica Operacional, semántica denotacional, semántica Axiomática, Gramáticas con Atributos.

Tema 7. Generación de código

Algoritmos y programas. Algoritmos y Estructuras de Datos I

PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR:

Procesadores de lenguaje Tema 4 Análisis semántico

GRAMATICAS LIBRES DEL CONTEXTO

Tema: Autómatas de Estado Finitos

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Las Etapas de la Compilación

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55

Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Tema 5 Tabla de Símbolos

Unidad II: Análisis semántico

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

Procesadores de Lenguaje

COMPILADORES E INTERPRETES

El lenguaje C. 1. Identificadores, constantes y variables

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

Tema: Tabla de Símbolos

COMPILADORES Teoría e implementación. Jacinto Ruiz Catalán

JavaCC Parte I. 1 Compiladores / Guía VII / Ciclo Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores.

4. Operadores Operador asignación

SSL Guia de Ejercicios

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Procesadores de Lenguaje

Operadores y Expresiones

Tema 4. Operadores y Expresiones

Construcción de tablas de análisis sintáctico LL(1)

Introducción a ANTLR. Procesadores de Lenguaje. 1 de 25

Tema 1.3. Un lenguaje mínimo y su procesador: Restricciones contextuales

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Tema 6 Organización y gestión de la memoria

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Procesadores de lenguaje Tema 6 La tabla de símbolos

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas

TEMA 2: ANÁLISIS LÉXICO-SINTÁCTICO

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

CONJUNTOS REGULARES. Orlando Arboleda Molina. 19 de Octubre de Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle

Elementos léxicos del lenguaje de programación Java

Hoja técnica sobre yacc 1 y lex 2. Introducción. lex PL, 2014/2015 1

Construcciones del Lenguaje Java

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Tema 2. El lenguaje JAVA

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

Unidad IV Análisis Sintáctico. M.C. Juan Carlos Olivares Rojas

Clase 14: Gramáticas libres de contexto

Guía práctica de estudio 05: Diagramas de flujo

Fundamentos de Programación 2017-I

Toda copia en PAPEL es un "Documento No Controlado" a excepción del original.

Tema 3. Tipos de datos simples

Compiladores: Parsing ascendente

Fundamentos de programación

El proceso del Análisis Léxico

CONCEPTOS BASICOS DEL LENGUAJE JAVA

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior. Trabajo Final

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Programación: Estructuras de Control

S Qué es el analizador sintáctico?

Unidad I Introducción a la programación de Sistemas. M.C. Juan Carlos Olivares Rojas

Operaciones básicas con hojas de cálculo

Estructuras en LabVIEW.

TEMA 3.- El analizador sintáctico

Procesadores de lenguaje Tema Análisis sintáctico (Parte I)

Programación en Lenguaje C

TEMA 5: Subprogramas, programación modular

Estatutos de Control C# Estatutos de Decisión (Selección)

Tipos De Datos. Numéricos. Alfanuméricos (string) Arreglos (Vectores, Matrices) Estructurados Registros (Def. Por el Archivos Usuario) Apuntadores

Transcripción:

Departamento de Tecnologías de la Información Tema 5 Análisis semántico Ciencias de la Computación e Inteligencia Artificial

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 2

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 3

5.1 Características del análisis semántico Objetivos: Verificar la semántica de la cadena de entrada: Verificar que las variables han sido declaradas previamente Comprobación de tipos en las expresiones Comprobación de los parámetros de una función Elección de la función u operador en caso de sobrecarga o polimorfismo Emitir informes de errores semánticos Construir el Árbol de Sintaxis Abstracta 4

5.1 Características del análisis semántico Principio de la traducción dirigida por la sintaxis: El significado (semántica) de una frase está directamente relacionado con su estructura sintáctica Especificación semántica Se inserta en la especificación sintáctica Se amplían las gramáticas libres de contexto: Se asocia información a los símbolos (atributos) Se asocian acciones semánticas (código) a las producciones 5

5.1 Características del análisis semántico Árbol de Sintaxis Abstracta Recoge toda la información sintáctica y semántica Elimina los símbolos que no aportan significado Los nodos reflejan los datos asociados a cada símbolo El objetivo de las acciones semánticas es construir este árbol 6

5.1 Características del análisis semántico Ejemplo: a = b + c ; <Asignación> asignación id = <Expresión> ; <Expresión> + <Término> variable nombre: a tipo: entero suma tipo: entero <Término> <Factor> id <Factor> id variable nombre: b tipo: entero constante nombre: c tipo: entero valor: 5 7

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 8

5.2 Gramáticas atribuidas Atributos: Elementos de los símbolos del lenguaje que almacenan información semántica: Tipo de datos Referencia a las variables Etc. Acciones semánticas Expresiones que permiten calcular el valor de los atributos 9

5.2 Gramáticas atribuidas Tipos de atributos: Atributos sintetizados: Aquellos cuyo valor se calcula a partir de la información de los nodos hijos. Representan un flujo de información ascendente en el árbol. Ej.: <A> <B> <C> <D> { A.a = B.b + C.c + D.d } Atributos heredados: Aquellos cuyo valor se calcula a partir de la información del nodo padre o de los hermanos. Representan un flujo de información descendente. Ej.: <A> <B> <C> <D> { C.c = A.a + B.b } 10

5.2 Gramáticas atribuidas Los atributos sintetizados de un símbolo representan una información que se calcula después de reconocer sintácticamente ese símbolo. Los atributos heredados de un símbolo representan una información que es necesario conocer antes de reconocer sintácticamente el símbolo. Generalmente se considera que los atributos de los tokens (símbolos terminales) son siempre sintetizados. Estos atributos son los generados por el analizador léxico. 11

5.2 Gramáticas atribuidas Ejemplo (declaración de variables en C): Atributos Estructura D.s, L.s, Lp.s class L ista{ int tipo; String nombre; Lista sig; } T.s, L.h, Lp.h int Producción Regla semántica asociada <D> <T> <L> pyc { L.h = T.s; D.s = L.s } <T> float { T.s = REAL } <T> int { T.s = ENTERO } <L> id <Lp> {Lp.h = L.h; L.s.tipo = L.h; L.s.nombre = id.lexema; L.s.sig = Lp.s} <Lp> coma id <Lp 1 > { Lp 1.h = Lp.h; Lp.s.tipo = Lp.h; <Lp> l { Lp.s = null } Lp.s.nombre = id.lexema; Lp.s.sig = Lp 1.s } 12

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 13

5.3 Especificación de un traductor Gramáticas con atributos por la izquierda Son un subconjunto de las gramáticas con atributos. Los atributos heredados se calculan exclusivamente a partir de los símbolos a la izquierda del atributo. Cualquier información heredada está disponible en el momento de ejecutar la reglas de producción correspondiente. Los flujos de información en el árbol de sintaxis abstracta se producen de izquierda a derecha, de arriba hacia abajo o de abajo hacia arriba. Nunca de derecha a izquierda. Permiten definir traductores de una sola pasada. 14

5.3 Especificación de un traductor Esquemas de traducción dirigidos por la sintaxis (ETDS) Son un formalismo para construir traductores de una sola pasada Emplean gramáticas con atributos por la izquierda. Incluyen acciones semánticas encerradas entre llaves ( {... } ) en cualquier punto de las reglas de producción. Las acciones semánticas incluyen fragmentos de código en un lenguaje de programación. Las acciones semánticas pueden incluir instrucciones que no se refieran al cálculo de atributos. 15

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 16

5.4 Traductores descendentes Desarrollo de un ETDS basado en análisis descendente Los atributos sintetizados de cada símbolo S se almacenan en la estructura de datos (objeto) que devuelve la función asociada al símbolo S. Los atributos heredados de cada símbolo S se describen como parámetros de la función asociada al símbolo S. Las acciones semánticas incluidas en las reglas de producción de un símbolo S se añaden directamente al código de la función asociada al símbolo S. 17

5.4 Traductores descendentes Ejemplo de un ETDS basado en análisis descendente Reglas de producción <D> <T> <L> pyc <T> float <T> int <L> id <Lp> <Lp> coma id <Lp 1 > <Lp> l Atributos clase L { int tipo; String id; L siguiente; } T.s (int) (sintetizado), L.h (int) (heredado), Lp.h (int heredado) D.s (L) (sintetizado), L.s (L) (sintetizado), Lp.s (L) (sintetizado) 18

5.4 Traductores descendentes Ejemplo de un ETDS basado en análisis descendente Gramática atribuida <D> <T> { L.h = T.s } <L> pyc { D.s = L.s } <T> float { T.s = REAL } <T> int { T.s = ENTERO } <L> { L.s = new L(); } id { L..s.id = id; L.s.tipo = L.h; Lp.h = L.h } <Lp> { L..s.siguiente = Lp.s } <Lp> { Lp.s = new L(); } coma id { Lp.s.id = id; Lp.s.tipo = Lp.h; Lp 1.h = Lp.h } <Lp 1 > { Lp.s.siguiente = Lp 1.s } <Lp> l { Lp.s = null } 19

5.4 Traductores descendentes Ejemplo de un ETDS basado en análisis descendente Función asociada a <D> L parsed() { L D_s; switch(nexttoken.getkind()){ case FLOAT: case INT: int T_s = parset(); // las funciones devuelven objetos L L_s = parsel( T_s ); // los atributos heredados match(pyc); // se pasan como argumentos D_s = L_s; break; default: error(); } return D_s; } 20

5.4 Traductores descendentes Función asociada a <T> int parset() { int T_s; switch(nexttoken.getkind()) { case FLOAT: match(float); T_s = REAL; break; case INT: match(int); T_s = ENTERO; break; default: error(); } return T_s; } 21

5.4 Traductores descendentes Función asociada a <L> L parsel(int L_h) { L L_s; switch(nexttoken.getkind()) { case ID: L_s = new L(); Token tk = match(id); // El analizador léxico devuelve objetos L_s.tipo = L_h; L_s.id = tk.lexema; L Lp_s = parselp(l_h); L_s.siguiente = Lp_s; break; default: error(); } return L_s; } 22

5.4 Traductores descendentes Función asociada a <Lp> L parselp(int Lp_h) { L Lp_s; switch(nexttoken.getkind()) { case COMA: Lp_s = new L(); match(coma); Token tk = match(id); Lp_s.tipo = Lp_h; Lp_s.id = tk.lexema; L Lp1_s = parselp(lp_h); Lp_s.siguiente = Lp1_s; break; case PYC: Lp_s = null; break; default: error(); } return Lp_s; } 23

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 24

5.5 Traductores ascendentes Desarrollo de un ETDS basado en análisis ascendente A cada estado de la tabla se le puede asociar un símbolo (terminal o no terminal) que corresponde al símbolo que provoca la transición a ese estado. Los atributos sintetizados de cada símbolo S se almacenan en una estructura de datos (objeto). Se utiliza una pila de atributos, paralela a la pila de estados, para almacenar estas estructuras. Las acciones semánticas situadas al final de una regla se ejecutan al reducir la regla. 25

5.5 Traductores ascendentes Desarrollo de un ETDS basado en análisis ascendente Las acciones semánticas situadas en puntos intermedios se sustituyen por símbolos ficticios (marcadores) a los que se asocia una regla de producción l seguida de la acción semántica. Conocida la longitud de una regla, se puede saber la posición de cada estructura de datos tomando como base la cima de la pila. Los atributos heredados de un símbolo no se pueden tratar directamente, sino que se introducen como atributos sintetizados del símbolo anterior. 26

5.5 Traductores ascendentes Ejemplo de un ETDS basado en análisis ascendente Reglas de producción <E> <E> mas <T> <E> <T> <T> num <T> parab <E> parce Ejemplo 7 + ( 8 + 2 + ( 3 + 1 ) ) 27

5.5 Traductores ascendentes Ejemplo de un ETDS basado en análisis ascendente Autómata Reconocedor de Prefijos Viables S0 <X> <E> <E> <E> mas <T> <E> <T> <T> num <T> parab <E> parce parab parab S4 <T> parab <E> parce <E> <E> mas <T> <E> <T> <T> num <T> parab <E> parce <E> <T> num num <T> <E> S1 <X> <E> <E> <E> mas <T> S2 <E> <T> S3 <T> num S2 mas S6 <T> parab <E> parce <E> <E> mas <T> mas S5 parce S5 <E> <E> mas <T> <T> num <T> parab <E> parce S7 <E> <E> mas <T> S8 <T> <T> parab <E> parce num parab S3 S4 28

5.5 Traductores ascendentes Ejemplo de un ETDS basado en análisis ascendente Tabla de análisis SLR Símbolo Estado mas num parab parce $ <E> <T> - 0 d3 d4 1 2 <E> 1 d5 aceptar <T> 2 r2 r2 r2 num 3 r3 r3 r3 parab 4 d3 d4 6 2 mas 5 d3 d4 7 <E> 6 d5 d8 <T> 7 r1 r1 r1 parce 8 r4 r4 r4 29

5.5 Traductores ascendentes Ejemplo de un ETDS basado en análisis ascendente Traza de la cadena 7+5 Pila de atributos - - num - <T> - <E> - <E> mas - <E> mas num - <E> mas <T> - <E> Pila de estados 0 0 3 0 2 0 1 0 1 5 0 1 5 3 0 1 5 7 0 1 Entrada Acción num mas num $ d3 mas num $ r3 mas num $ r2 mas num $ d5 num $ d3 $ r3 $ r1 $ aceptar 30

5.5 Traductores ascendentes Ejemplo de un ETDS basado en análisis ascendente Gramática atribuida <E> <E> mas <T> { $$.op = SUMA; $$.izquierda = $1; SS.derecha = $3; } <E> <T> { $$.op = TERMINO; $$.izquierda = $1; $$.derecha = NULL; } Notación (utilizada en YACC) $$ es la estructura de datos de la parte izquierda de la regla. $1.. $N es la estructura de datos del símbolo 1.. N de la parte derecha. Para una regla de N símbolos, la estructura $M se encuentra en la posición N-M desde la cima de la pila. No admite atributos heredados. 31

5.5 Traductores ascendentes Ejemplo de un ETDS basado en análisis ascendente Notación Las acciones semánticas situadas al final de una regla se ejecutan al reducir esa regla Las acciones semánticas intermedias se sustituyen por nuevas reglas (marcadores). Por ejemplo: <E> <E> { $$.izq = $1; } mas { $$.op = SUMA; } <T> { $$.dcha = $3; } se transforma en: <E> <E> <M1> mas <M2> <T> { $$.dcha = $3; } <M1> l { $$.izq = $1; } <M1> l { $$.op = SUMA; } 32

Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas 5.3 Especificación de un traductor 5.4 Traductores descendentes 5.5 Traductores ascendentes 5.6 Estructuras básicas 33

5.6 Estructuras básicas Generación de una estructura de lista id next id next id next Gramática LL(1) BNF <Lista> id <SigueLista> <SigueLista> coma id <SigueLista> <SigueLista> l Gramática LL(1) EBNF <Lista> id ( coma id )* Gramática LR(1) <Lista> id <Lista> <Lista> coma id 34

5.6 Estructuras básicas Generación de una estructura de lista Gramática LL(1) BNF <Lista> id <SigueLista> { e = new Element(), e.id = id, e.next = SigueLista.s, Lista.s = e } <SigueLista> coma id <SigueLista 1 > { e = new Element(), e.id = id, e.next = SigueLista 1.s, SigueLista.s = e } <SigueLista> l { SigueLista.s = null } Gramática LL(1) EBNF <Lista> id { e = new Element(), e.id = id, e.next = null, Lista.s = e, last = e } ( coma id { e = new Element(), e.id = id, e.next = null, last.next = e, last = last.next } )* 35

5.6 Estructuras básicas Generación de una estructura de lista Gramática LR(1) <Lista> id { e = new Element(), e.id = id, e.next = null, Lista.s = e, Lista.last = e } <Lista> <Lista 1 > coma id { e = new Element(), e.id = id, e.next = null, Lista.s = Lista 1.s, Lista 1.last.next = e, Lista.last = e } Gramática LR(1) <Lista> id { e = new Element(), e.id = id, e.next = null, Lista.s = e } <Lista> id coma <Lista 1 > { e = new Element(), e.id = id, e.next = Lista 1.s, Lista.s = e } 36

5.6 Estructuras básicas Generación de una estructura de árbol binario suma suma num Gramática LL(1) BNF <Árbol> num <SigueÁrbol> <SigueÁrbol> más num < SigueÁrbol > < SigueÁrbol > l Gramática LL(1) EBNF <Árbol> num ( más num )* Gramática LR(1) <Árbol> num < Árbol > < Árbol 1 > más num num num 37

5.6 Estructuras básicas Generación de una estructura de árbol binario Gramática LL(1) BNF <Árbol> num { SigueÁrbol.h = num } <SigueÁrbol> {Árbol.s = SigueÁrbol.s } <SigueÁrbol> más num { SigueÁrbol 1.h = new Suma(SigueÁrbol.h,num) } <SigueÁrbol 1 > { SigueÁrbol.s = SigueÁrbol 1.s } <SigueÁrbol> l { SigueÁrbol.s = SigueÁrbol.h } Gramática LL(1) EBNF <Árbol> num { Árbol.s = num } ( más num { Árbol.s = new Suma(Árbol.s,num) } )* 38

5.6 Estructuras básicas Generación de una estructura de árbol binario Gramática LR(1) <Árbol> num { Árbol.s = num } <Árbol> <Árbol 1 > más num { Árbol.s = new Suma(Árbol 1.s, num) } 39

5.6 Estructuras básicas Generación de una estructura de vector class Vector { public Vector(); public add(element e); } Gramática LL(1) BNF <Lista> num <SigueLista> { v = new Vector(), v.add(num), SigueLista.h = v, Lista.s = v } <SigueLista> más num { SigueLista.h.add(num), SigueLista 1.h = SigueLista.h } <SigueLista 1 > <SigueLista> l { } Gramática LL(1) EBNF <Lista> { v = new Vector() } num { v.add(num) } ( más num { v.add(num) } )* { Lista.s = v } 40

5.6 Estructuras básicas Generación de una estructura de vector class Vector { public Vector(); public add(element e); } Gramática LR(1) <Lista> num { v = new Vector(), v.add(num), Lista.s = v } <Lista> <Lista 1 > más num { Lista.s = Lista 1.s, Lista.s.add(num) } 41