Contexto de tablas de símbolos. Más...
#include <sTable.h>
Métodos públicos estáticos | |
| static sTable * | sys_sTable () |
| static sTable * | new_sTable (bool level_default=true) |
| static sTable * | new_sTable (sTable *s, bool level_default=true) |
| static void | add_sTable (sTable *s) |
| static int | search_sTable (sTable *s) |
| static void | setGlobal (runNode *node) |
Atributos públicos | |
| vector< symbols * > | tables_ |
| int | level_ |
| symbols | functions_ |
| runNode * | node_use_ |
Atributos públicos estáticos | |
| static sTable * | sTable_use = NULL |
| static sTable * | sTable_ini = NULL |
| static symbols | class_ |
| static vector< sTable * > | sTables_ |
| static map< runNode *, refNode *, cmp_runNode > | globals_ |
Contexto de tablas de símbolos.
La tabla de símbolos es una estructura de datos que sirve para guardar referencias a nodos creados dinámicamente.
Gracias a la tabla de símbolos es posible que durante el recorrido de una determinada rama del árbol de ejecución se cree un nodo en memoria dinámica que será utilizado en ramas posteriores. Para ello en la tabla de símbolos se crea un nodo referencia que apunta al valor creado. De esta forma, con solo conocer la clave de la referencia, es posible acceder al nodo creado en cualquier momento posterior de la ejecución.
El contexto se define mediante tres tablas de símbolos:
Adicionalmente puede tener una tabla de símbolos de acceso global.
La primera puede contener referencias a cualquier tipo de nodo, aunque la gramática hace que sólo existan referencias a nodos de tipos de datos (arrays, strings...) o a nodos etiquetas. La tabla de funciones guarda referencia a nodos de este tipo. Análogamente, la tabla de clases guarda referencias a las nodos de tipo clase.
La tabla de variables se estructura en varios niveles. Así las claves de un nivel generalmente no son accesibles desde ejecuciones que se realicen en otro. Esto establece un ámbito para las claves de la tabla de símbolo.
La tabla de funciones y de clases solo consta de un nivel.
Para acceder a la tabla de símbolos se utilizan una serie de clases de nodos que funcionan como interfaz.
Se debe destacar que puede haber más de una tabla de un contexto. Elementos como las clases disponen de su propio contexto. Se define pues el concepto de contexto activo, que no es más que una referencia al contexto sobre la que se debe operar.
Los contextos puede tener ligados un nodo ejecutable. Este nodo, denominado nodo en uso o activo, es aquel que trabaja sobre los elementos de las tablas. Así un nodo clase, por ejemplo, el contexto de una clase estará relacionado con la propia clase. Se crea así una referencia en doble sentido que permite, conociendo un contexto, obtener el elemento que opera sobra ella.
Se define el contexto principal como el primer contexto que se crea en la ejecución. Este es añadido a una lista de contextos. Cuando otro contexto fuera a ser usado es puesto al final de la lista hasta que finaliza su uso.
Esta clase proporciona métodos estáticos para manipular el sistema de tablas en ejecución.
| sTable::sTable | ( | ) |
Constructor que inicializa un nuevo contexto de tablas de símbolos.
| sTable::sTable | ( | sTable * | s | ) |
Constructor copia. Crea un contexto a partir de otro. Para ello se copian por valor los elementos de las distintas estructuras que los forman.
| s | Contexto a copiar |
Obtiene la referencia del nivel actual de la tabla de variables correspondiente a la clave dada. Si la clave no se encuentra se crea y devuelve una referencia que apunta a un nodo nulo.
| str | Clave relativa a la referencia. |
Obtiene la referencia de la tabla de clases correspondiente a la clave dada. Si la clave no se encuentra se crea y devuelve una referencia que apunta a un nodo nulo.
| str | Clave relativa a la referencia. |
Obtiene la referencia de la tabla de funciones correspondiente a la clave dada. Si la clave no se encuentra se crea y devuelve una referencia que apunta a un nodo nulo.
| str | Clave relativa a la referencia. |
Añade un referencia con la clave dada en el nivel actual de la tabla de variables. La referencia apuntará al nodo dado. Si ya existía una referencia con dicha clave se elimina el valor anterior.
| str | Clave para la referencia. |
| node | Nodo al que apuntará la referencia. |
|
static |
Añade un contexto a la lista de contextos en ejecución.
| s | Contexto a añadir. |
Añade un referencia con la clave dada a la tabla de clases. La referencia apuntará al nodo dado. Si ya existía una referencia con dicha clave se elimina el valor anterior.
| str | Clave para la referencia. |
| node | Nodo al que apuntará la referencia. |
Añade un referencia con la clave dada a la tabla de funciones. La referencia apuntará al nodo dado. Si ya existía una referencia con dicha clave se elimina el valor anterior.
| str | Clave para la referencia. |
| node | Nodo al que apuntará la referencia. |
| void sTable::clear | ( | runNode * | str | ) |
Elimina el elemento del nivel actual de la tabla de variables referenciado por la clave dada. Luego elimina la referencia.
| void sTable::cprint | ( | ) |
Método para la depuración del intérprete que imprime el contenido de la tabla de clases.
| symbols * sTable::currentlevel | ( | ) |
Obtiene el nivel actual de la tabla de variables
| bool sTable::exist | ( | runNode * | str | ) |
Devuelve un booleano que indica si existe en el nivel actual de la tabla de variables una clave str.
| bool sTable::existclass | ( | runNode * | str | ) |
Devuelve un booleano que indica si existe en la tabla de clases una clave str.
| bool sTable::existfunction | ( | runNode * | str | ) |
Devuelve un booleano que indica si existe en la tabla de funciones una clave str.
| void sTable::fprint | ( | ) |
Método para la depuración del intérprete que imprime el contenido de la tabla de funciones.
Obtiene el valor de la referencia dada por la clave facilitada en el nivel actual de la tabla de variables.
| key | Clave. |
Obtiene la referencia dada por la clave facilitada en el nivel actual de la tabla de variables.
| key | Clave. |
Obtiene el valor la referencia dada por la clave facilitada en la tabla de funciones.
| key | Clave. |
Obtiene la referencia dada por la clave facilitada en la tabla de funciones.
| key | Clave . |
| symbols sTable::getFunctions | ( | ) |
Obtiene la tabla de símbolos funciones.
| int sTable::getLevel | ( | ) | const |
Obtiene el nivel actual de la tabla de variables.
| int sTable::getLevelTop | ( | ) | const |
Obtiene el nivel superior de la tabla de variables.
| runNode * sTable::getNodeUse | ( | ) | const |
Devuelve el elemento en uso. Este elemento será aquel asociado al contexto.
| symbols * sTable::getTable | ( | ) |
Obtiene la tabla de símbolos variables.
| bool sTable::isPrivate | ( | runNode * | str | ) |
Determina si un identificador presenta la etiqueta de privado dentro del contexto.
| str | Nodo que hace de identificador |
| bool sTable::isref | ( | runNode * | node, |
| int | level_see | ||
| ) |
Determina si existe una referencia a un nodo desde un nivel distinto a level_see.
| bool sTable::isrefAll | ( | runNode * | node, |
| int | level_see | ||
| ) |
Determina si existe una referencia a un nodo desde cualquier tabla de símbolos.
| void sTable::mklevel | ( | symbols * | default_level = NULL | ) |
Crea un nivel en la tabla de variables
|
static |
Crea una contexto nuevo y lo introduce en la lista de contextos en ejecución.
| level_default | Indica si la tabla de variables del contexto creado comienza con el primer nivel de la tabla del contexto actual. |
Devuelve un contexto nuevo, creado a partir de uno dado. Además mete en la lista de tablas de símbolos en ejecución la nueva tabla. La tabla creada contiene el primer nivel de la tabla variables de la tabla de símbolos inicial, además de la tabla de funciones y de clases.
| void sTable::print | ( | ) |
Método para la depuración del intérprete que imprime el contenido de la tabla de variables.
| void sTable::rmlevel | ( | ) |
Elimina las referencias del nivel actual. Por último cambia el nivel actual al nivel anterior.
|
static |
Busca un contexto en la lista de contextos en ejecución. Devuelve la posición en la que se encuentra.
| s | Contexto a buscar. |
| void sTable::setDeleteCurrentLevel | ( | bool | del | ) |
Determina si el nivel actual de la tabla de símbolos de variables debe ser eliminado al disminuir el nivel.
| del | Booleano que indica si se ha de eliminar el nivel actual de la tabla del símbolos. |
Se añade una referencia a la tabla de funciones que apunta al nodo dado.
| key | Clave. |
| exp | Valor. |
|
static |
Busca una tabla de símbolos en la lista de tablas en ejecución. Devuelve la posición en la que se encuentra en la tabla.
| void sTable::setLevel | ( | int | l | ) |
Método modificador que cambia el nivel actual de la tabla de variables.
| l | Nivel |
| void sTable::setNodeUse | ( | runNode * | node | ) |
Asigna el elemento en uso. Este elemento será aquel asociado al contexto.
| node | Nodo que hace uso del contexto. |
| void sTable::setPrivate | ( | runNode * | str | ) |
Le añade a un identificador la etiqueta de privado dentro del contexto.
| str | Nodo que hace de identificador. |
|
static |
Inicializa el sistema de contextos de tablas de símbolos. Para ello crea un nuevo contexto que será el inicial, y lo introduce en la lista de contextos en ejecución.
|
static |
Tabla de clases.
| symbols sTable::functions_ |
Tabla de funciones.
|
static |
Tabla de elementos globales.
| int sTable::level_ |
Nivel máximo de la tabla de variables.
| runNode* sTable::node_use_ |
Referencia al nodo asociado al contexto. Representa el nodo en uso.
Si es NULL significa que el contexto no se encuentra ligado a ningún elemento concreto y se trata con carácter global.
|
static |
Guarda una referencia a la tabla de símbolos inicial.
|
static |
Guarda una referencia a la tabla de símbolos activa. Si se cambia el valor de atributo todos los nodos trabajarán con la nueva tabla de símbolos.
|
static |
Lista de tablas en ejecución.
| vector<symbols *> sTable::tables_ |
Lista de Tabla de variables.