Symbol tables/fr
│
English (en) │
français (fr) │
Retour au contenu FPC internals
Tables de symboles
Architecture
La table des symboles contient toutes les définitions pour tous les symboles dans le compilateur. Il contient aussi toute information de type de tous les symboles rencontrés pendant le processus d'analyse. Tous les symboles sont accessibles sous forme de flux et sont utilisés dans les fichiers PPU pour éviter de tout recompiler pour vérifier si tous les symboles sont valides.
Il y a différents types de tables de symboles, qui peuvent tous être actives à un moment ou à un autre selon le contexte de l'analyseur.
Une vue d'ensemble architecturale de l'interaction entre les tables de symboles, les entrées de symboles et les entrées de définition est présentée dans la figure 4.1.
Comme cela peut être vu, les entrées de tables de symboles sont faites en utilisant un algorithme de hachage rapide avec un dictionnaire d'empreinte (hash dictionary).
L'Objet Table de symboles
Toutes les tables de symboles dans le compilateur proviennent de ce type d'objet, qui contient des champs pour la taille totale des donnnées dans la table de symboles, et des méthodes pour lire la table de symboles dans un flux. Le départ de la liste chaînée des tables de symboles actives est la variable symtablestack.
http://www.pjh2.de/fpc/CompilerInternalsFigure04.png
type
TSymTable = classu
name: pshortstring; // uppercased realname
realname : pshortstring; // used to generate long symbol names (like symble.name + '.' + sym.name)
DefList : TFPObjectList; // list of definitions
SymList : TFPHashObjectList; // list of symbols
defowner : TDefEntry; // The owner definition. Value for records, objects and enumerations.
moduleid : longint; // unit index
refcount : smallint; // count of references. if few objects shares the same
// symbol table - they add a new reference instead of
// full copying the symbols
currentvisibility : tvisibility; // current visibility of symtable - used while parsing object members
// to put them into symtable with the correct visibility
currentlyoptional : boolean; // used while parsing of objc protocol
symtablelevel : byte; // level of symtable, used for nested procedures
symtabletype : TSymtabletype; // Indicates the type of this symbol table (2).
end;
Le type des tables de symboles possibles sont montrés dnas la table suivante:
Champ | Description |
---|---|
abstractsymtable | Valeur par défaut quand la tables est créée et que son type n'est pas défini. Utilisé à des fins de mise au point |
WithSymTable | Tous les symboles accédés dans une instruction with |
StaticSymTable | Contient les symboles de la partie implémentation de l'unité ou du programme |
GlobalSymTable | Contient les symboles de l'interface de l'unité |
ObjectSymTable | Contient tous les symboles dans un objet/une classe/une interface/une classe objc et les autres instructions de types d'objet |
RecordSymTable | Contient tous les symboles dans une instruction records |
LocalSymTable | Tient les symboles pour toutes les variables locales d'une routine |
ParaSymTable | Tient les symboles pour tous les paramètres d'une routine (les symboles de déclaration de paramètre effectif) |
Stt_ExceptSymTable | Contient tous les symboles d'exception définis dans un bloc except |
exportedmacrosymtable | Tient toutes les macros exportées |
localmacrosymtable | Tient toutes les macros actuellement dans la portée |
enumsymtable | Contient tous les symboles d'éléments d'une énumération |
Insertion de symboles dans une table de symboles
(Dernière mise à jour pour FPC version 1.0.x)
To add a symbol into a specific symbol table, that’s symbol table’s Insert method is called, which in turns call the Insert_In_Data method of that symbol. Insert_In_Data, depending on the symbol type, adjusts the alignment and sizes of the data and actually creates the data entry in the correct segment.
http://www.pjh2.de/fpc/CompilerInternalsFigure05.png
Symbol table interface
(Dernière mise à jour pour FPC version 1.0.x)
Routines
Search_a_Symtable
Déclaration: | function Search_a_Symtable(const Symbol: String; SymTableType: TSymTableType): PSym; |
Description: | Search for a symbol Symbol in a specified symbol table SymTableType. Returns NIL if the symbol table is not found, and also if the symbol cannot be found in the desired symbol table. |
GetSym
Déclaration: | procedure GetSym(const S: StringId; NotFoundError: Boolean); |
Description: | Search all the active symbol tables for the symbol s,setting the global variable SrSym to the found symbol, or to nil if the symbol was not found. notfounderror should be set to TRUE if the routine must give out an error when the symbol is not found. |
GlobalDef
Déclaration: | function GlobalDef(const S: String): PDef; |
Description: | Returns a pointer to the definition of the fully qualified type symbol S, or NIL if not found.
Notes: It is fully qualified, in that the symbol system.byte, for example, will be fully resolved to a unit and byte type component The symbol must have a global scope, and it must be a type symbol, otherwise NIL will be returned. |
Variables
SrSym
Déclaration: | var SrSym: PSym; |
Description: | This points to the symbol entry found, when calling getsym. |
SrSymTable
Déclaration: | var SrSymTable: PSymTable; |
Description: | This points to the symbol table of the symbol SrSym when calling GetSym. |
Prochain chapitre: Entrée de table de symboles