Análisis Semántico

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

COMPILADORES

Taller de Análisis Semántico


Patricio Lema G.

¿Cuál es el objetivo principal del analizador 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.

 Revelar posibles ambigüedades existentes implementaciones de procesadores de


lenguajes o en documentos descriptivos de lenguajes de programación.
 Ser utilizados como base para la implementación de procesadores de lenguaje.
 Verificar propiedades de programas en relación con pruebas de corrección o
información relacionada con su ejecución.
 Diseñar nuevos lenguajes de programación, permitiendo registrar decisiones sobre
construcciones particulares del lenguaje, así como permitir descubrir posibles
irregularidades u omisiones.
 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.
 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: El significado de cada construcción sintáctica es especificado mediante


la computación que se lleva a cabo en su ejecución sobre una máquina abstracta.
Ejemplo. Lo siguiente es la especificación formal de la semántica de una asignación en un
lenguaje de programación:

Lo que se encuentra en la parte superior es una “premisa” y en la parte inferior una “conclusión”.
La premisa indica que el resultado de evaluar una expresión e en un determinado almacén σ
(estado de una máquina abstracta) produce un valor v. La conclusión indica que, dado un estado
σ, la asignación de una expresión e a un identificador x produce un nuevo estado resultado de
añadir a σ la asociación del valor de v al identificador x.
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 [Watt96].

Ejemplo.- La especificación de una asignación en semántica denotacional 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

Ejemplo.- La siguiente especificación de la semántica de una sentencia de asignación ha sido


descrita utilizando la semántica axiomática:

Semántica algebraica: Se basa en la especificación de tipos de datos abstractos mediante una


colección de operaciones (incluyendo alguna constante).

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: Fue elaborado por Peter Mosses [Mosses91] para describir la semántica
de lenguajes de un modo más inteligible. Las especificaciones semánticas de lenguajes siempre
han sido consideradas como oscuras, complicadas y únicamente legibles por expertos,
adquiriendo así una mala reputación por su uso intensivo de símbolos matemáticos [Watt96].

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.

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: Si enmarcamos la sentencia


anterior en el siguiente programa C:
 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.

 Comprobaciones de enlace: 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: Cuando un lenguaje posee el


operador de asignación como una expresión y no como una sentencia (C y Java frente a
Pascal), hay que comprobar que la expresión de la parte izquierda de la asignación posee
una dirección de memoria en la que se pueda escribir (lvalue). Esta restricción puede ser
comprobada por el analizador semántico, permitiendo sintácticamente que cualquier
expresión se encuentre en la parte izquierda del operador de asignación.

 Comprobaciones dinámicas: n. Diversos ejemplos pueden ser acceso a un vector fuera


de rango, utilización de un puntero nulo o división por cero.

 Comprobaciones de tipo: 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.

Qué comprende el análisis semántico como decoración del Árbol de Sintaxis abstracta.
Un procesador de lenguaje en el que todas las fases ocurren en un único recorrido del código
fuente se denomina de una pasada 14. En este tipo de procesadores, el análisis semántico y la
generación de código están intercaladas con el análisis sintáctico –y por tanto con el análisis
léxico. Este tipo de compiladores es más eficiente y emplea menos memoria que los que
requieren más de una pasada. Sin embargo, el código que genera acostumbra a ser menos
eficiente que los compiladores que emplean más de una pasada. Pascal y C son ejemplos de
lenguajes que pueden ser compilados con una sola pasada –por ello, es siempre necesario
declarar una función antes de utilizarla (forward en Pascal).

Defina las características más importantes del Árbol de sintaxis abstracta.


Como sabemos, un árbol sintáctico es una representación de la estructura de una consecución
de componentes léxicos (tokens), en la que éstos aparecen como nodos hoja y los nodos
internos representan los pasos en las derivaciones de la gramática asociada. Los árboles
sintácticos poseen mucha más información de la necesaria para el resto de las fases de un
compilador, una vez finalizada la fase de análisis sintáctico.

Una simplificación de árbol sintáctico que represente toda la información necesaria para el resto
del procesamiento del programa de un modo más eficiente que el árbol sintáctico original,
recibe el nombre de árbol de sintaxis abstracta (AST, Abstract Syntax Tree). Así, la salida
generada por un analizador sintáctico de varias pasadas, será el AST representativo del
programa de entrada. Un AST puede ser visto como el árbol sintáctico de una gramática
denominada abstracta, al igual que un árbol sintáctico es la representación de una gramática
(en ocasiones denominada concreta). Por tanto, es común ver una gramática que representa
una simplificación de un lenguaje de programación denominada gramática abstracta 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.

expresion: expresion '+' termino


| expresion '-' termino
| termino
;
termino: termino '*' factor
| termino '/' factor
| factor
;

Gramatica Abstracta:
Expresion: expresionBinaria
| expresionUnaria
| constanteEntera
;
expresionBinaria: expresion ( ' * ' | ' / ' | ' + ' ) expresion
; ;
constanteEntera: CTE_ENTERA
;

You might also like