lunes, 30 de mayo de 2016

Unidad 04 Análisis Semántico


Análisis semántico
Se trata de determinar el tipo de los resultados
intermedios, comprobar que los argumentos
que tiene un operador pertenecen al conjunto
de los operadores posibles, y si son compatibles
entre sí, etc. En definitiva, comprobará que el
significado de lo que se va leyendo es válido.

Es una estructura jerárquica en la cual se registran las operaciones que implica u operan dentro del programa fuente.

En cada una de las ramas del
arbol semanticose registra el
valor o significado que este
debe tener, y el analisis semantico
se encarga de terminar cual de
los valores registrados en las
ramas es aplicable.

Un compilador necesita guardar y usar la información de los objetos que se va encontrando en el texto fuente, como variables,etiquetas,declaraciones de tipos, etc.
Esta información se almacena en una estructura de datos interna conocida como tabla de símbolos.


COMPROBACIONES SEMÁNTICAS TIPOS

Comprobaciones ESTÁTICAS.
Las comprobaciones sintácticas y semánticas.

Comprobaciones DINÁMICAS.
Realizadas en tiempo de ejecución.

De TIPO.
Verificación del tipo de los operando en las expresiones.

De FLUJO de CONTROL.
Verifica los puntos del programa de salida y entrada del control.

De UNICIDAD.
Verifica la presencia de símbolos de forma única.
(ejemplo: declarar un símbolo una sólo vez).

Relación de NOMBRES.
Un mismo nombre puede aparecer más de una vez.
GUÍA PRACTICA

Unidad 03: Análisis Sintáctico

¿QUÉ ES EL ANALIZADOR SINTÁCTICO?
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol sintáctico que lo reconoce.
El análisis sintáctico es un análisis a nivel de sentencias, y es mucho más complejo que el análisis léxico. Su función es tomar el programa fuente en forma de tokens, que recibe del analizador léxico, y determinar la estructura de las sentencias del programa. Este proceso es similar a determinar la estructura de una frase en castellano, determinando quien es el sujeto, predicado, el verbo y los complementos. El análisis sintáctico agrupa a los tokens en clases sintácticas (denominadas no terminales en la definición de la gramática), tales como expresiones, procedimientos, etc.

EL ANALIZADOR SINTÁCTICO (ASN) comprueba que el orden en que el analizador léxico le va entregando los tokens es válido. Si esto es así significará que la sucesión de símbolos que representan dichos tokens puede ser generada por la gramática correspondiente al lenguaje del código fuente.
LAS PRINCIPALES FUNCIONES SON:
Identificar cada tipo de instrucción y sus componentes. 
– Completar la Tabla de Símbolo s. 
– Realizar comprobaciones estáticas: 
• Se realizan durante la compilación del programa. 
• Ejemplos: comp. de tipos, unicidad de etiquetas e identificadores, etc. 
– Realizar comprobaciones dinámicas: 
• Aquellas que el compilador incorpora al programa traducido. 
• Hacen referencia a aspectos que sólo pueden ser conocidos en tiempo de ejecución 
• Dependientes del estado de la máquina en la ejecución o del propio programa.
 – Validar las declaraciones de identificadores: en muchos lenguajes no se puede usar una variable si no ha sido declarada con anterioridad.

TIPOS DE ANÁLISIS SINTÁCTICOS
Desde el punto de vista de la teoría de Análisis Sintáctico, hay dos estrategias para construir el árbol sintáctico:

Análisis descendente: partimos de la raíz del árbol (donde estará situado el axioma o símbolo inicial de la gramática) y se van aplicando reglas por la izquierda de forma que se obtiene una derivación por la izquierda de la cadena de entrada. Para decidir qué regla  aplicar, se lee un token de la entrada. Recorriendo el árbol de análisis sintáctico resultante, en profundidad de izquierda a derecha, encontraremos en las hojas del árbol los tokens que nos devuelve el Analizador Léxico (A.L.) en ese mismo orden.

Análisis ascendente: partiendo de la cadena de entrada, se construye el árbol de análisis sintáctico empezando por las hojas (donde están los tokens) y se van creando nodos intermedios hasta llegar a la raíz (hasta el símbolo inicial), construyendo así el árbol de abajo a arriba. El recorrido del árbol se hará desde las hojas hasta la raíz. El orden en el que se van encontrando las producciones corresponde a la inversa de una derivación por la derecha.
Las dos estrategias recorren la cadena de entrada de izquierda a derecha una sola vez, y necesitan (para que el análisis sea eficiente) que la gramática no sea ambigua.
Para ello, el analizador sintáctico (A.S.) comprueba que el orden en que el analizador léxico le va entregando los tokens es válido. Si esto es así significará que la sucesión de símbolos que representan dichos tokens puede ser generada por la gramática correspondiente al lenguaje del código fuente.

MANEJO DE ERRORES SINTÁCTICOS
Si un compilador tuviera que procesar sólo programas correctos, su diseño e implantación se simplificarían mucho. Pero los programadores a menudo escriben programas incorrectos, y un buen compilador debería ayudar al programador a identificar y localizar errores. Es más, considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los errores.

Los errores en la programación pueden ser de los siguientes tipos:
• Léxicos, producidos al escribir mal un identificador, una palabra clave o un operador.
• Sintácticos, por una expresión aritmética o paréntesis no equilibrados.
• Semánticos, como un operador aplicado a un operando incompatible.
• Lógicos, puede ser una llamada infinitamente recursiva.

GRAMÁTICAS DE ATRIBUTOS. Una gramática de atributos es una gramática libre de contexto cuyos símbolos pueden tener asociados atributos y las producciones pueden tener asociadas reglas de evaluación de los atributos. En la creación de compiladores se utilizan ecuaciones de atributos o reglas semánticas como método para expresar la relación entre el cálculo de los atributos y las reglas del lenguaje. Cada producción (regla sintáctica) tiene asociada una acción semántica que se aplica cuando se realiza una reducción en el análisis sintáctico ascendente.
Atributo: propiedad de una construcción de un lenguaje. Pueden variar mucho en cuanto a información que contienen o tiempo que tardan en determinarse durante la traducción/ejecución. Cada símbolo (terminal o no terminal) puede tener asociado un número finito de atributos. Ejemplos de atributos: 
– Tipo de una variable 
– Valor de una expresión 
– Ubicación en memoria de una variable 
–  Código objeto de un procedimiento 
– Número de dígitos significativos en un número


domingo, 29 de mayo de 2016

El ANALIZADOR LÉXICO

Un programa fuente es una serie de símbolos (letras, símbolos, caracteres especiales: +, *, !). Con estos símbolos se representan las construcciones del lenguaje tales como variables, etiquetas, palabras reservadas, constantes, etc. Es necesario que el compilador o traductor identifique los distintos significados de estas construcciones, que los creadores de lenguajes dan en la definición del lenguaje.

El programa fuente se trata inicialmente con el analizador léxico (en inglés scanner), con el propósito de agrupar el texto en grupos de caracteres con significado propio llamados tokens o componentes léxicos, tales como variables, identificadores, palabras reservadas y operadores. Por razones de eficiencia a cada token se le asocia un atributo (o más de uno) que se representa internamente por un código numérico o por un tipo enumerado.

CONCEPTOS ANALIZADOR LÉXICO

Token
Es el nombre que se le da a cada patrón definido, éste nombre debe usarse en todos los procesos del análisis en todos los lexemas encontrados.

Patrón
Es una representación lógica de una serie de agrupaciones de caracteres con características comunes.

Lexema
Es cada una de las combinaciones de caracteres que encajan en la definición de un patrón o token. Ej. Variable1, x, a, edad, y2, etc.

Atributo
Características propias de cada token, por tanto se les denomina atributos del token.

Gramática
Se define como un ente formal para especificar de una manera finita el conjunto de cadenas de símbolos que constituyen un lenguaje.

Alfabeto
Conjunto finito de símbolos no vacío que conforman una gramática, se representan por Σ (sigma).

Símbolo
Entidad abstracta que no se va a definir pues se deja como axioma. Normalmente son letras de alfabetos, números o caracteres especiales como +, -, *, /, etc. No necesariamente serán uno solo, ya que un símbolo puede ser una combinación como palabras reservadas de un lenguaje de programación then, end, beging, else, while, etc.

Expresión Regular
Representan patrones de cadenas de caracteres. Se conocen más como metalenguajes que sirven para describir los lenguajes regulares.

Diagrama de Transición
Es el conjunto de secuencias de entrada que representan gráficamente los símbolos validos por la gramática, es una representación de los universales autómatas que aparecen en la matemática y otras ciencias.

Tabla de Transiciones
Es la manera más cercana de representar los autómatas, consta de filas que representan los estados y las columnas que representan los símbolos de entrada. Adicionalmente se agregan dos columnas para representar los tokens y para indicar retrocesos.

Cadena
Se define como una secuencia de símbolos de un lenguaje determinado. Por ejemplo 0001, abcd, a+4*b, 11000, etc. Una cadena siempre tiene una longitud que esta denotada por la cantidad de símbolos independientes que la conforman.
|abcde| →5
|000111| →6
Cuando la cadena es vacía se representa como |λ|→0.

Lenguaje
Un lenguaje es un conjunto de palabras que se puede representar con un determinado alfabeto.

Autómata
Es una construcción lógica que recibe como entrada una cadena de símbolos y produce una salida indicando si la salida es una cadena que pertenece a un determinado lenguaje.
Tabla de Símbolos

DEFINICIÓN DE TABLA DE SÍMBOLOS

Una tabla de símbolos es una estructura de datos usada en el proceso de traducción
de un lenguaje de programación (por un compilador o un intérprete), dónde cada
símbolo en el código fuente de un programa está asociado con información tal como
la ubicación, el tipo de datos y el ámbito de cada variable, constante o
procedimiento. Esta estructura de datos contiene una entrada o registro para cada

identificador. Cada registro incluye los campos para los atributos del identificador.

ESTRUCTURA
  • LEXEMA: distintas políticas de almacenamiento.
  • ATRIBUTOS: cuanta información contiene dicho campo depende del objeto que denota el lexema.
FUNCIONAMIENTO
Conforme van apareciendo nuevas declaraciones de identificadores, el analizador
léxico, o el analizador sintáctico según la estrategia que sigamos, insertará nuevas
entradas en la tabla de símbolos, evitando siempre la existencia de entradas
repetidas. El analizador semántico efectúa las comprobaciones sensibles al contexto
gracias a la tabla de símbolos, y el generador de código intermedio usa las
direcciones de memoria asociadas a cada identificador en la tabla de símbolos, al
igual que el generador de código.

Unidad 02: Análisis Léxico


Clasificación de los Lenguajes de Programación

Los lenguajes de programación según su grado de independencia de la máquina:

a) Lenguaje máquina (representación binaria o hexadecimal.).
b) Lenguaje ensamblador o de bajo nivel (versión simbólica de un lenguaje máquina).
c) Lenguaje de medio nivel (lenguaje C).
d) Lenguaje de alto nivel (FORTRAN, COBOL, Pascal).

Lenguaje de máquina.
El lenguaje de máquina de una computadora consta de cadenas de números binarios (ceros y unos) y es el único que "entienden" directamente los procesadores.

Lenguaje ensamblador.
La comunicación en lenguaje de máquina es particular de cada procesador que se usa, y programar en este lenguaje es muy difícil y tedioso, por lo que se empezó a buscar mejores medios de comunicación con ésta.

Lenguajes de alto nivel.
Los primeros programas ensambladores producían sólo una instrucción en lenguaje de máquina por cada instrucción del programa fuente.

Los lenguajes de programación según su forma de procesar el código fuente

FASES DE LOS COMPILADORES

  •  Traductores (translators).
  •  Compiladores (compilers).
  •  Ensambladores (assemblers).
  •  Interpretes (interpreters).
  • Editores (editors).


INTERPRETES

Concepto de Interprete

  • Un intérprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel, la traduce al código equivalente y al mismo tiempo la ejecuta.
  • Un intérprete es un programa que analiza y ejecuta simultáneamente el programa fuente, es decir no producen un código objeto, siendo su ejecución simultánea a la del programa fuente.
Su principal ventaja es que permiten una fácil depuración. Permiten una mayor interactividad con el código en tiempo de desarrollo.

Clasificación de Intérpretes
•Intérpretes Puros
•Interpretes Avanzados
•Interpretes Incrementales









PROCESO DE COMPILACIÓN
























Unidad 01: Introducción a Los Traductores



Fases de un compilador

Agrupación lógica de un compilador
Etapa Inicial

  • Fases, o parte de fases que dependen del lenguaje fuente y que son independientes de la máquina
  • Análisis léxico, sintáctico, semántico y generación de código intermedio, manejo de errores de cada parte

Etapa Final

  • Fases que depende de la máquina, depende del lenguaje intermedio
  • Optimización de código, generación de código, operaciones con la tabla de símbolos

UNIVERSIDAD GERARDO BARRIOS

 

COMPILADORES E INTÉRPRETES 

Docente: Ing. Marvin Osmaro Parada

Responsable: Katherine Elisa Gómez Turcios


Introducción

La cátedra de Compiladores e Intérpretes presenta una introducción al software cuya
función única es compilar programas fuentes en un determinado lenguaje, y producir
programas ejecutables, la asignatura cubre los fundamentos conceptuales, el principio de
funcionamiento, la estructura básica interna; así también presenta un estudio de aspectos,
léxicos, sintácticos y semánticos propios de un compilador. Al final se realiza un proyecto
que será el producto de la asistencia técnica proporcionada al alumno y su ingenio en el
diseño de compiladores e intérpretes.



Dentro de la asignatura se desarrollan las siguientes unidades

CONTENIDO DE LA ASIGNATURA

Unidad 01: Introducción a Los Traductores
1.1 Conceptos Generales
1.2 Clasificación de los Traductores
1.3 Metalenguajes
1.4 Estructura de un Compilador

Unidad 02: Análisis Léxico
2.1 Definición – Implementación
2.2 Conceptos de Token, patrones, lexema y atributo
2.3 Especificaciones de un Token. Expresiones regulares
2.4 El Autómata Finito
2.5 La Tabla de Transición
2.6 Tratamiento de Errores
2.7 Tabla de Símbolos

Unidad 03: Análisis Sintáctico
3.1 Gramáticas Libres de Contexto
3.2 Derivación. Ambigüedad
3.3 Analizador Sintáctico. Tipos
3.4 Analizador Sintáctico descendente determinista LL(1)
3.5 Comprobación si una gramática es LL(1). Iniciales y seguidores autómatas de pilas
3.6 Tabla de Análisis
3.7 Tratamiento de errores.

Unidad 04 Análisis Semántico
4.1 Introducción
4.2 Especificación formal
4.3 Fases en el Análisis Semántico
4.4 Determinación de los tipos de Comprobaciones Semánticas a Realizar
4.5 Implementación de acciones Semánticas

Unidad 05 Lenguajes Intermedios y Generación de Código
5.1 Lenguajes Intermedios, Definición y Tipos
5.2 Optimización Independiente de la Máquina
5.3 Generador de Código Intermedio y Final
5.4 Optimización Dependiente de la Máquina