SUBTEMAS UNIDAD I.
1.1
"ÁRBOLES DE EXPRESIONES"
-
Es una estructura jerárquica en la cual se registran las
operaciones que realiza el programa fuente.
-
En cada una de las ramas del árbol se registra el valor o significado
que este debe tener y el análisis se encarga de terminar cuál de los
valores registrado en la rama es aplicable.
-
Los árboles de expresiones representan el código de nivel del
lenguaje en forma de datos. Los datos se almacenan en una estructura con forma de árbol.
operaciones que realiza el programa fuente.
-
Es una estructura jerárquica en la cual se registran las
operaciones que realiza el programa fuente.
1.2
"ACCIONES SEMÁNTICAS DE UN ANALIZADOR SINTÁCTICO"
Se encargan de que los tipos que intervienen en las expresiones sean
compatibles o que los parámetros reales de una función sean coherentes
con los parámetros formales.
¿Qué hace un análisis semántico?
El análisis semántico, es un método de procesamiento del lenguaje natural,
consiste en examinar el significado de las palabras y frases para comprender
el propósito de una oración o párrafo.
¿Cómo funciona un analizador sintáctico?
Su principal función es analizar la secuencia de componentes léxicos de la
entrada para verificar que cumplen con las reglas gramaticales especificadas.
Esta interacción se aplica bajo un esquema donde el analizador léxico es una
subrutina o corutina del analizador sintáctico.
¿Qué es la tabla de símbolos en lenguajes y autómatas?
La tabla de símbolos (TS) es la estructura utilizada por el compilador para
almacenar los atributos asociados a los símbolos que se utilizan en un lenguaje
de programación. Los atributos que esta estructura almacena para cada símbolo
puede ser: Tipo: entero, real, char, boolean.
1.3
"COMPROBACIONES DE TIPOS EN EXPRESIONES"
La labor de comprobación de tipos consiste en conferir a las construcciones
sintácticas del lenguaje, la semántica de tipificación y en realizar todo tipo
de comprobaciones de dicha índole. Por su naturaleza, sin embargo, ésta se
encuentra repartida entre la fase de análisis semántico y la generación de
código intermedio.
-
Comprobaciones estáticas
Las comprobaciones estáticas recogen el compendio de todas aquellas tareas de
carácter semántico que, por su naturaleza, pueden ser realizadas directamente
durante la fase de compilación mediante el uso de artefactos y mecanismos
propios de dicha fase. Este tipo de comprobaciones son beneficiosas puesto que
confieren seguridad a la ejecución del programa.
-
Verificar que los tipos y valores asociados a los objetos de un programa
se utilizan de acuerdo con la especificación del lenguaje.
-
Detectar conversiones implícitas de tipos para efectuarlas o insertar el
código apropiado para efectuarlas
-
Almacenar información relativa a los tipos de los objetos
"APLICAR LAS REGLAS DE VERIFICACIÓN DE TIPOS
¿CÓMO Y CUÁNDO APLICARLAS?"
-
Equivalencia:
Determina cuándo dos objetos pueden considerarse del mismo tipo.
-
Compatibilidad:
Determina cuándo un objeto de cierto tipo puede ser usado en un cierto
contexto.
-
Inferencia:
Derivación del tipo de un objeto a partir de sus componentes.
-
Conversión:
Permitir y efectuar un cambio de tipo.
-
Coerción:
conversión automática de un tipo a otro.
1.4
"PILA SEMÁNTICA EN UN ANALIZADOR SINTÁCTICO"
PILA
Estructura de datos que se usa en programación para simplificar ciertas operaciones.
ARRAYS * Listas Enlazadas *
Una colección de datos a los que se puede acceder mediante un extremo, que se conoce generalmente como tope.
-
El análisis semántico usa como entrada el árbol sintáctico para comprobar
restricciones de tipo y otras limitaciones semánticas y preparar la
generación de código.
"¿PARA QUE SE USA LA PILA?"
-
Para contener la información semántica asociada a los operandos
(y operadores) en forma de registros semánticos tomando en cuenta las reglas
semánticas.
-
(Conj. de normas y especificaciones que definen al lenguaje).
Conversiones implícitas
"¿COMO DIBUJAR UN ÁRBOL SINTÁCTICO?"
Un árbol no es otra cosa que una forma de visualizar la estructura
de una oración.
Es una notación puramente formal, sin sustancia alguna.
Precisamente por eso, queremos que sea lo más claro y representativo
posible.
Queremos que muestre todas las relaciones relevantes en la oración
sin confusión.
-
Primero, hay que asegurarse de que las palabras están en sucesión
lineal de izquierda a derecha, y en el mismo orden en que aparecen
en la oración.
Hay que evitar escribir una palabra encima de la otra.
Además, conviene subrayar las palabras, para que contrasten
claramente con los nudos categoriales del árbol.
-
La idea es que debemos poder leer la oración de izquierda a derecha
sin tener que volver los ojos hacia la izquierda en ningún punto.
"EJEMPLO #1 DE COMO DIBUJAR UN ÁRBOL SINTÁCTICO"
"EJEMPLO #2 DE COMO DIBUJAR UN ÁRBOL SINTÁCTICO"
"1.4 PILA SEMANTICA EN UN ANALIZADOR SINTÁCTICO"
1.5
"ESQUEMA DE TRADUCCIÓN"
Un esquema de traducción es una gramática independiente de contexto en la que se asocian
atributos con los símbolos gramaticales y se insertan acciones semánticas encerradas entre
llaves { } dentro de los lados derechos de las producciones.
Los esquemas de traducción pueden tener tantos atributos sintetizados como heredados.
Cuando se diseña un esquema de traducción, se deben respetar algunas limitaciones
para asegurarse de que el valor de un atributo esté disponible cuando una acción
se refiera a él. Estas limitaciones, motivadas por las definiciones con atributos
por la izquierda, garantizan que las acciones no hagan referencia a un atributo que
aún no haya sido calculado.
El ejemplo más sencillo ocurre cuando sólo se necesitan atributos sintetizados,
en este caso, se puede construir el esquema de traducción creando una acción que
conste de una asignación para cada regla semántica y colocando esta acción al
final del lado derecho de la producción asociada.
Traducción descendente
Se trabaja con esquema de traducción en lugar de hacerlo con definiciones
dirigidas por sintaxis, así que se puede ser explícito en cuanto al orden en
que tienen que lugar las acciones y las evaluaciones de los atributos.
Eliminación de la recursividad izquierda de un esquema de traducción
Como la mayoría de los operadores aritméticos son asociativos por la izquierda, es natural
utilizar gramáticas recursivas por la izquierda para las expresiones. La transformación se
aplica a esquemas de traducción con atributos sintetizados.
Para el análisis sintáctico descendente, se supone que una acción se ejecuta en el mismo
momento en que se expandiría un símbolo en la misma posición. Un atributo heredado de un
símbolo debe ser calculado por una acción que aparezca antes que el símbolo, y un atributo
sintetizado del no terminal de la izquierda se debe calcular después de que hayan
sido calculados todos los atributos de los que depende.
Un atributo heredado de un símbolo debe ser calculado por una acción que aparezca antes que
el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe calcular después
de que hayan sido calculados todos los atributos de los que depende.
Los fragmentos de código así insertados se denominan acciones semánticas. Dichos fragmentos actúan,
calculan y modifican los atributos asociados con los nodos del árbol sintáctico. El orden en que se
evalúan los fragmentos es el de un recorrido primero-profundo del árbol de análisis sintáctico.
Obsérvese que, en general, para poder aplicar un esquema de traducción hay que construir el árbol
sintáctico y después aplicar las acciones empotradas en las reglas en el orden de recorrido
primero-profundo.
Por supuesto, si la gramática es ambigua una frase podría tener dos árboles y
la ejecución de las acciones para ellos podría dar lugar a diferentes resultados. Si se quiere
evitar la multiplicidad de resultados (interpretaciones semánticas) es necesario precisar de qué
árbol sintáctico concreto se está hablando.
"EJEMPLO #1 ESQUEMA DE TRADUCCIÓN"
1.6
"GENERACIÓN DE LA TABLA DE SÍMBOLO Y TABLA DE DIRECCIONES"
Las tablas de símbolos (también llamadas tablas de identificadores y tablas de nombres),
realizan dos importantes funciones en el proceso de traducción: verificar que la semántica
sea correcta y ayudar en la generación apropiada de código. Ambas funciones se realizan
insertando o recuperando desde la tabla de símbolos los atributos de las variables usadas en
el programa fuente. Estos atributos, tales como: el nombre, tipo, dirección de almacenamiento y
dimensión de una variable, usualmente se encuentran explícitamente en las declaraciones o más
implícitamente a través del contexto en que aparecen los nombres de variables en el programa.
Una de las estructuras de datos que se encuentran relacionadas con las fases del proceso de
compilación es la tabla de símbolos, la cual tiene como propósito registrar información que se
comparte entre varias etapas y que permite administrar los recursos asociados a las entidades que
manipulará el programa. La tabla de símbolos tiene típicamente la siguiente estructura:
Una tabla de símbolos puede conceptualizarse como una serie de renglones, cada uno de los cuales
contiene una lista de valores de atributos que son asociados con una variable en particular.
Las clases de los atributos que aparecen en una tabla de símbolos dependen en algún grado de la
naturaleza del lenguaje de programación para el cual se escribe el compilador.
Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo no necesita aparecer
en la tabla. Similarmente, la organización de la tabla de símbolos variará dependiendo de las
limitaciones de memoria y tiempo de acceso.
"EJEMPLO #1 GENERACIÓN DE LA TABLA DE SÍMBOLO Y TABLA DE DIRECCIONES"
1.7
"MANEJO DE ERRORES SEMÁNTICOS"
Es una de las misiones más importantes de un compilador, aunque, al mismo tiempo, es lo que más
dificulta su realización. A veces unos errores ocultan otros.
A veces un error provoca una avalancha de muchos errores que se solucionan con el primero.
Es conveniente un buen manejo de errores, y que el compilador detecte todos los errores que tiene
el programa y no se pare en el primero que encuentre. Hay, pues, dos criterios a seguir a la hora
de manejar errores:
-
Pararse al detectar el primer error.
-
Detectar todos los errores de una pasada.
El análisis semántico es posterior al sintáctico y mucho más difícil de formalizar que éste.
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.
La salida "teórica" de la fase de análisis semántico sería un árbol semántico. Consiste en un árbol
sintáctico en el que cada una de sus ramas ha adquirido el significado que debe tener. En el caso de
los operadores polimórficos (un único símbolo con varios significados), el análisis semántico
determina cuál es el aplicable.
PRESENTADO POR: |
Sánchez Flores Aleksandra Estefanía |