TALLER DE ACTIVIDADES DE COMPILADORES
Fecha: 31 de mayo del 2018
Nombre: Alex Jhonatan Toapanta Molina
Tema: Análisis sintáctico.
 ¿Cuál es el objetivo principal del analizar semántico de un procesador de lenguajes?
El objetivo principal del analizador semántico de un procesador de lenguaje es asegurarse de
que el programa analizado satisfaga las reglas requeridas por la especificación del lenguaje, para
garantizar su correcta ejecución. El tipo y dimensión de análisis semántico requerido varía
enormemente de un lenguaje a otro. En lenguajes interpretados como Lisp o Smalltalk casi no
se lleva a cabo análisis semántico previo a su ejecución, mientras que en lenguajes como Ada, el
analizador semántico deberá comprobar numerosas reglas que un programa fuente está
obligado a satisfacer.
 A qué refiere la descripción formal de la semántica de lenguajes de programación, cite 6
especificaciones más usadas.
1. Revelar posibles ambigüedades existentes implementaciones de procesadores de
lenguajes o en documentos descriptivos de lenguajes de programación.
2. Ser utilizados como base para la implementación de procesadores de lenguaje.
3. Verificar propiedades de programas en relación con pruebas de corrección o
información relacionada con su ejecución.
4. Diseñar nuevos lenguajes de programación, permitiendo registrar decisiones sobre
construcciones particulares del lenguaje, así como permitir descubrir posibles
irregularidades u omisiones.
5. Facilitar la comprensión de los lenguajes por parte del programador y como
mecanismo de comunicación entre diseñador del lenguaje, implementador y
programador. La especificación semántica de un lenguaje, como documento de
referencia, aclara el comportamiento del lenguaje y sus diversas construcciones.
6. Estandarizar lenguajes mediante la publicación de su semántica de un modo no
ambiguo. Los programas deben poder procesarse en otra implementación de
procesador del mismo lenguaje exhibiendo el mismo comportamiento.
 Cuáles son los puntos de vista de descripción semántica más utilizados, realice un
resumen corto y un ejemplo de la especificación de los mismos.
Semántica Operacional.-Lo que realmente especifica es como se lleva a cabo dicha
ejecución. Los significados del programa son descritos en términos de operaciones,
utilizando un lenguaje basado en reglas de inferencia lógicas en las que se describen
formalmente las secuencias de ejecución de las diferentes instrucciones sobre una
máquina abstracta.
Ejemplo:
Este ejemplo es una especificación formal de la semántica de una asignación en un
lenguaje de programación.
Semántica denotacional.- La representación del comportamiento de cada sentencia o frase del
lenguaje se lleva a cabo mediante entidades matemáticas (denotación) que representan el
efecto de haber ejecutado las sentencia o frase asociada.
Ejemplo:
La especificación de una asignación en semántica denatacional es:
Semántica Axiomática.- Especifica las propiedades del efecto de ejecutar las sentencias
sintácticamente correctas, expresadas mediante asertos, desoyendo así los aspectos de su
ejecución. El sistema permite estudiar formalmente las propiedades del lenguaje y se
requiere la utilización de sistemas consistentes y completos [Hoare73]. Se utiliza
mayoritariamente en verificación formal de corrección de programas.
Ejemplo:
Semántica algebraica.- Se basa en la especificación de tipos de datos abstractos mediante una
colección de operaciones (incluyendo alguna constante). Puesto que un conjunto de valores
al que se le añaden una colección de operaciones constituye un álgebra, este método de
descripción formal de semántica se denomina semántica algebraica.
Ejemplo:
La especificación del tipo lógico (booleano) en un lenguaje de programación puede llevarse a
cabo del siguiente modo, siguiendo la semántica algebraica:
Semántica de acciones.- esta semántica está basada en el concepto de acciones que reflejan las
operaciones comunes en los lenguajes de programación, ofreciendo primitivas para la
asignación y declaración de identificadores, así como la combinación de instrucciones mediante
control de flujo secuencial, condicional e iterativo
 Cuál es la conexión directa entre el análisis semántico con el resto de fases que emplea
un compilador, explique a través del organizador gráfico de Aho.
La conexión directa que tiene el análisis semántico con el resto de fases del compilador es la
Tabla de símbolos (Inserción y búsqueda de símbolos) y otra con el Manejador de errores
(Errores Semánticos).
 Cite de forma rápida ejemplos de comprobaciones que hace el analizador semántico con
respecto a:
✓ Declaración de identificadores y reglas de ámbitos
✓ Comprobaciones de unicidad
-Constantes de cada case en Pascal, C o Java. Cada uno de los elementos existentes en los
condicionales múltiples de los lenguajes de programación mencionados, ha de ser único. En
otro caso, el analizador semántico deberá generar un error de compilación.
−Los valores de un tipo enumerado de Pascal o C han de ser únicos.
−Las etiquetas de un lenguaje de programación, como un ensamblador, no pueden estar
repetidas, puesto que los saltos a las mismas serían ambiguos.
−La declaración de un identificador en un ámbito ha de ser única en multitud de lenguajes de
programación.
✓ Comprobaciones de enlace
-En un ensamblador, un salto a una etiqueta requiere que ésta haya sido referida como una
posición de memoria.
−En el lenguaje de programación ANSI C [Kernighan91] y en ISO/ANSI C++ [ANSIC++] la
invocación a una función o método requiere que éstos hayan sido declarados previamente.
✓ Comprobaciones pospuestas por el analizador sintáctico
Las sentencias break y continue de Java y C sólo pueden utilizarse en determinadas estructuras
de control del lenguaje. Éste es otro escenario para que el analizador sintáctico posponga la
comprobación hasta la fase análisis semántico.
✓ Comprobaciones dinámicas
-El acceso a un vector fuera de rango.
-Utilización de un puntero nulo.
-División por cero.
✓ Comprobaciones de tipo
-Comprobar las operaciones que se pueden aplicar a cada construcción del lenguaje. Dado un
elemento del lenguaje, su tipo identifica las operaciones que sobre él se pueden aplicar. Por
ejemplo, en el lenguaje Java el operador de producto no es aplicable a una referencia a un
objeto. De un modo contrario, el operador punto sí es válido.
-Inferir el tipo de cada construcción del lenguaje. Para poder implementar la
comprobación anterior, es necesario conocer el tipo de toda construcción sintácticamente
válida del lenguaje. Así, el analizador semántico deberá aplicar las distintas reglas de inferencia
de tipos descritas en la especificación del lenguaje de programación, para conocer el tipo de
cada construcción del lenguaje.
 Qué comprende el análisis semántico como decoración del Árbol de Sintaxis abstracta.
Comprenden la asignación de información adicional a los nodos del AST representando
propiedades de las construcciones sintácticas del lenguaje, tales como el tipo de una expresión.
Un
AST decorado o anotado es una ampliación del AST, en el que a cada nodo del mismo se le
añaden atributos indicando las propiedades necesarias de la construcción sintáctica que
representan.
 Defina las características más importantes del Árbol de sintaxis abstracta.
-Las expresiones tendrán asociadas un atributo tipo que indique si son reales o enteras. Esto es
necesario porque se podrá asignar un valor entero a una expresión real, pero no al revés.
−Las expresiones deberán tener un atributo lógico que indique si son o no lvalues. De este
modo, se podrá comprobar si lo que está a la izquierda de la asignación es o no
semánticamente correcto.
−En una declaración se deberá insertar el identificador en una tabla de símbolos con su tipo
declarado, para poder conocer posteriormente el tipo de cualquier identificador en una
expresión. Es, por tanto, necesario asignar un atributo nombre (cadena de caracteres) a un
identificador.
−Finalmente, aunque más enfocado a la fase de generación de código o interpretación que al
análisis semántico– se le asigna un valor entero o real a las constantes del lenguaje.
 Defina una gramática concreta para la siguiente operación 7+ (4*2) * 5 /(10*2) y
finalmente genere su árbol sintáctico
Gramática Abstracta:
Expresión: expresionBinaria
| expresionUnitaria
| constanteEntera
;
expresionBinaria: expresión ('*'|'/'|'+') expresión
;
constanteEntera: CTE_ENTERA
;
Taller compiladores Análisis Semántico

Taller compiladores Análisis Semántico

  • 1.
    TALLER DE ACTIVIDADESDE COMPILADORES Fecha: 31 de mayo del 2018 Nombre: Alex Jhonatan Toapanta Molina Tema: Análisis sintáctico.  ¿Cuál es el objetivo principal del analizar semántico de un procesador de lenguajes? El objetivo principal del analizador semántico de un procesador de lenguaje es asegurarse de que el programa analizado satisfaga las reglas requeridas por la especificación del lenguaje, para garantizar su correcta ejecución. El tipo y dimensión de análisis semántico requerido varía enormemente de un lenguaje a otro. En lenguajes interpretados como Lisp o Smalltalk casi no se lleva a cabo análisis semántico previo a su ejecución, mientras que en lenguajes como Ada, el analizador semántico deberá comprobar numerosas reglas que un programa fuente está obligado a satisfacer.  A qué refiere la descripción formal de la semántica de lenguajes de programación, cite 6 especificaciones más usadas. 1. Revelar posibles ambigüedades existentes implementaciones de procesadores de lenguajes o en documentos descriptivos de lenguajes de programación. 2. Ser utilizados como base para la implementación de procesadores de lenguaje. 3. Verificar propiedades de programas en relación con pruebas de corrección o información relacionada con su ejecución. 4. Diseñar nuevos lenguajes de programación, permitiendo registrar decisiones sobre construcciones particulares del lenguaje, así como permitir descubrir posibles irregularidades u omisiones. 5. Facilitar la comprensión de los lenguajes por parte del programador y como mecanismo de comunicación entre diseñador del lenguaje, implementador y programador. La especificación semántica de un lenguaje, como documento de referencia, aclara el comportamiento del lenguaje y sus diversas construcciones. 6. Estandarizar lenguajes mediante la publicación de su semántica de un modo no ambiguo. Los programas deben poder procesarse en otra implementación de procesador del mismo lenguaje exhibiendo el mismo comportamiento.  Cuáles son los puntos de vista de descripción semántica más utilizados, realice un resumen corto y un ejemplo de la especificación de los mismos.
  • 2.
    Semántica Operacional.-Lo querealmente especifica es como se lleva a cabo dicha ejecución. Los significados del programa son descritos en términos de operaciones, utilizando un lenguaje basado en reglas de inferencia lógicas en las que se describen formalmente las secuencias de ejecución de las diferentes instrucciones sobre una máquina abstracta. Ejemplo: Este ejemplo es una especificación formal de la semántica de una asignación en un lenguaje de programación. Semántica denotacional.- La representación del comportamiento de cada sentencia o frase del lenguaje se lleva a cabo mediante entidades matemáticas (denotación) que representan el efecto de haber ejecutado las sentencia o frase asociada. Ejemplo: La especificación de una asignación en semántica denatacional es: Semántica Axiomática.- Especifica las propiedades del efecto de ejecutar las sentencias sintácticamente correctas, expresadas mediante asertos, desoyendo así los aspectos de su ejecución. El sistema permite estudiar formalmente las propiedades del lenguaje y se requiere la utilización de sistemas consistentes y completos [Hoare73]. Se utiliza mayoritariamente en verificación formal de corrección de programas. Ejemplo: Semántica algebraica.- Se basa en la especificación de tipos de datos abstractos mediante una colección de operaciones (incluyendo alguna constante). Puesto que un conjunto de valores
  • 3.
    al que sele añaden una colección de operaciones constituye un álgebra, este método de descripción formal de semántica se denomina semántica algebraica. Ejemplo: La especificación del tipo lógico (booleano) en un lenguaje de programación puede llevarse a cabo del siguiente modo, siguiendo la semántica algebraica: Semántica de acciones.- esta semántica está basada en el concepto de acciones que reflejan las operaciones comunes en los lenguajes de programación, ofreciendo primitivas para la asignación y declaración de identificadores, así como la combinación de instrucciones mediante control de flujo secuencial, condicional e iterativo
  • 4.
     Cuál esla conexión directa entre el análisis semántico con el resto de fases que emplea un compilador, explique a través del organizador gráfico de Aho. La conexión directa que tiene el análisis semántico con el resto de fases del compilador es la Tabla de símbolos (Inserción y búsqueda de símbolos) y otra con el Manejador de errores (Errores Semánticos).  Cite de forma rápida ejemplos de comprobaciones que hace el analizador semántico con respecto a: ✓ Declaración de identificadores y reglas de ámbitos
  • 5.
    ✓ Comprobaciones deunicidad -Constantes de cada case en Pascal, C o Java. Cada uno de los elementos existentes en los condicionales múltiples de los lenguajes de programación mencionados, ha de ser único. En otro caso, el analizador semántico deberá generar un error de compilación. −Los valores de un tipo enumerado de Pascal o C han de ser únicos. −Las etiquetas de un lenguaje de programación, como un ensamblador, no pueden estar repetidas, puesto que los saltos a las mismas serían ambiguos. −La declaración de un identificador en un ámbito ha de ser única en multitud de lenguajes de programación. ✓ Comprobaciones de enlace -En un ensamblador, un salto a una etiqueta requiere que ésta haya sido referida como una posición de memoria. −En el lenguaje de programación ANSI C [Kernighan91] y en ISO/ANSI C++ [ANSIC++] la invocación a una función o método requiere que éstos hayan sido declarados previamente. ✓ Comprobaciones pospuestas por el analizador sintáctico Las sentencias break y continue de Java y C sólo pueden utilizarse en determinadas estructuras de control del lenguaje. Éste es otro escenario para que el analizador sintáctico posponga la comprobación hasta la fase análisis semántico. ✓ Comprobaciones dinámicas -El acceso a un vector fuera de rango. -Utilización de un puntero nulo. -División por cero. ✓ Comprobaciones de tipo -Comprobar las operaciones que se pueden aplicar a cada construcción del lenguaje. Dado un elemento del lenguaje, su tipo identifica las operaciones que sobre él se pueden aplicar. Por ejemplo, en el lenguaje Java el operador de producto no es aplicable a una referencia a un objeto. De un modo contrario, el operador punto sí es válido. -Inferir el tipo de cada construcción del lenguaje. Para poder implementar la comprobación anterior, es necesario conocer el tipo de toda construcción sintácticamente válida del lenguaje. Así, el analizador semántico deberá aplicar las distintas reglas de inferencia de tipos descritas en la especificación del lenguaje de programación, para conocer el tipo de cada construcción del lenguaje.
  • 6.
     Qué comprendeel análisis semántico como decoración del Árbol de Sintaxis abstracta. Comprenden la asignación de información adicional a los nodos del AST representando propiedades de las construcciones sintácticas del lenguaje, tales como el tipo de una expresión. Un AST decorado o anotado es una ampliación del AST, en el que a cada nodo del mismo se le añaden atributos indicando las propiedades necesarias de la construcción sintáctica que representan.  Defina las características más importantes del Árbol de sintaxis abstracta. -Las expresiones tendrán asociadas un atributo tipo que indique si son reales o enteras. Esto es necesario porque se podrá asignar un valor entero a una expresión real, pero no al revés. −Las expresiones deberán tener un atributo lógico que indique si son o no lvalues. De este modo, se podrá comprobar si lo que está a la izquierda de la asignación es o no semánticamente correcto. −En una declaración se deberá insertar el identificador en una tabla de símbolos con su tipo declarado, para poder conocer posteriormente el tipo de cualquier identificador en una expresión. Es, por tanto, necesario asignar un atributo nombre (cadena de caracteres) a un identificador. −Finalmente, aunque más enfocado a la fase de generación de código o interpretación que al análisis semántico– se le asigna un valor entero o real a las constantes del lenguaje.  Defina una gramática concreta para la siguiente operación 7+ (4*2) * 5 /(10*2) y finalmente genere su árbol sintáctico Gramática Abstracta: Expresión: expresionBinaria | expresionUnitaria | constanteEntera ; expresionBinaria: expresión ('*'|'/'|'+') expresión ; constanteEntera: CTE_ENTERA ;