The parser/fr
│
English (en) │
français (fr) │
Retour au contenu FPC internals
L'analyseur syntaxique
(Dernière mise à jour pour FPC version 1.0.x)
La tâche de l'analyseur syntaxique est de lire le jeton produit par l'analyseur lexicale et de s'assurer du respect de la syntaxe du Pascal. Il remplit aussi la table des symboles et créée les noeuds intermédiaires (l'arbre) qui sera utilisé par le générateur de code.
Une vue d'ensemble du processus d'analyse, aussi bien que la relation entre l'arbre, le contrôle de type et le générateur de code est montré dans le diagramme suivant :
http://www.pjh2.de/fpc/CompilerInternalsFigure08.png
Information de module
(Dernière mise à jour pour FPC version 1.0.x)
Chaque module étant compilé, qu'il soit une bibliothèque, une unité ou un programme principal a de l'information qui est requise. Ceci est stocké en mémoire dans l'objet TModule. Pour éviter la recompilation des modules déjà compilés, les dépendances des modules sont stockées dans le fichier PPU, ce qui rend aisée la détermination des modules à recompiler.
type
PModule = ^TModule;
TModule = object(TLinkedList_Item)
PPUFile: PPPUFile; // Pointer to PPU file object (unit file)
Crc: Longint; // CRC-32 bit of the whole PPU file
Interface_CRC: Longint; // CRC-32 bit of the interface part of
// the PPU file
Flags: Longint; // Unit file flags
Compiled: Boolean; // TRUE if module is already compiled
Do_Reload: Boolean; // TRUE if the PPU file must be reloaded
Do_Assemble: Boolean; // Only assemble, don’t recompile unit
Sources_Avail: Boolean; // TRUE if all sources of module are available
Sources_Checked: Boolean; // TRUE if the sources has already been checked
Is_Unit: Boolean; // TRUE if this is a unit (otherwise a library
// or a main program)
In_Compile: Boolean; // module is currently being recompiled
In_Second_Compile: Boolean; // module is being compiled for second time
In_Second_Load: Boolean; // module is being reloaded a second time
In_Implementation: Boolean; // currently compiling implementation part
// (units only)
In_Global: Boolean; // currently compiling implementation part
// (units only)
Recompile_Reason: TRecompile_Reason; // Reason why module should be recompiled
Islibrary: Boolean; // TRUE if this module is a shared library
Map: PUnitMap; // Map of all used units for this unit
Unitcount: Word; // Internal identifier of unit (for GDB support)
Unit_index: Word;
Globalsymtable: Pointer; // Symbol table for this module of externally
// visible symbols
Localsymtable: Pointer; // Symbol table for this module of locally
// visible symbols
Scanner: Pointer; // Scanner object pointer
Loaded_From: PModule; // Module which referred to this module
Uses_Imports: Boolean; // TRUE if this module imports symbols
// from a shared library
Imports: PLinkedList; // Linked list of imported symbols
_Exports: PLinkedList; // Linked list of exported symbols (libraries only)
SourceFiles: PFileManager; // List of all source files for this module
ResourceFiles: TStringContainer; // List of all resource files for this module
Used_Units: TLinkedList; // Information on units used by this module
// (pused_unit)
Dependent_Units: TLinkedList;
LocalUnitSearchPath, // Search path for obtaining module source code
LocalObjectSearchPath,
LocalIncludeSearchPath, // Search path for includes for this module
LocalLibrarySearchPath: TSearchPathList;
Path: PString; // Path were module is located or created
OutputPath: PString; // Path where object files (unit),
// executable (program) or
// shared library (library) is created
ModuleName: PString; // Name of the module in uppercase
ObjFileName: PString; // Full name of object file or executable file
AsmFileName: PString; // Full name of the assembler file
PPUFileName: PString; // Full name of the PPU file
StaticLibFilename: PString; // Full name of the static library name
// (used when smart linking is used)
SharedLibFilename: PString; // Filename of the output shared library
// (in the case of a library)
ExeFileName: PString; // Filename of the output executable
// (in the case of a program)
AsmPrefix: PString; // Filename prefix of output assembler
// files when using smartlinking
MainSource: PString; // Name of the main source file
end;
Types d'analyse
(Dernière mise à jour pour FPC version 1.0.x)
Entrée
Analyse de programme ou de bibliothèque
Analyse d'unité
Analyse de routine
Déclarations d'étiquette
Déclarations de constante
Déclarations de type
Déclarations de variable
Déclarations de variable thread
Déclarations de ressource de chaîne
Déclarations d'exports
Analyse d'expression
Déclarations de constante typée
Interface de l'analyseur
(Dernière mise à jour pour FPC version 1.0.x)
variables
AktProcSym
Déclaration: | var AktProcSym: PProcSym; |
Description: | Pointeur vers l'information de symbole pour la routine en cours d'analyse. |
LexLevel
Déclaration: | var LexLevel: Longint; |
Description: | Niveau de code en cours d'analyse et compilé 0 = pour le programme principal |
Current_Module
Déclaration: | var Current_Module: PModule; |
Description: | Information sur le module courant (programme, bibliothèque ou unité) en cours de compilation. |
Les variables suivantes ont des définitions de type par défaut qui sont créées chaque fois que la compilation commence (définition par défaut de l'unité System), ces définitions doivent toujours être valides:
VoidDef
Déclaration: | var VoidDef: POrdDef; |
Description: | Pointeur vers le type rien |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
cCharDef
Déclaration: | var cCharDef: POrdDef; |
Description: | Définition de type pour un caractère (char) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
cWideCharDef
Déclaration: | var cWideCharDef: POrdDef; |
Description: | Définition de type pour un caractère unicode (WideChar) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
BoolDef
Déclaration: | var BoolDef: POrdDef; |
Description: | Définition de type pour une valeur booléenne (boolean) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
u8BitDef
Déclaration: | var u8BitDef: POrdDef; |
Description: | Deéfinition de type pour une value 8-bit non signée (byte) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
u16BitDef
Déclaration: | var u16BitDef: POrdDef; |
Description: | Définition de type pour une valeur 16-bit non signée (word) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
u32BitDef
Déclaration: | var u32BitDef: POrdDef; |
Description: | Définition de type pour une valeur 32-bit non signée (cardinal) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
s32BitDef
Déclaration: | var s32BitDef: POrdDef; |
Description: | Définition de type pour une valeur 32-bit signée (Longint) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
cu64BitDef
Déclaration: | var cu64BitDef: POrdDef; |
Description: | Définition de type pour une valeur 64-bit non signée (QWord) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
cs64BitDef
Déclaration: | var cs64BitDef: POrdDef; |
Description: | Définition de type pour une valeur 64-bit signée (Int64) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
s64FloatDef
Déclaration: | var s64FloatDef: PFloatDef; |
Description: | Définition de type pour une valeur en virgule flottante 64-bit IEEE (double) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. Cela pourrait ne pas vraiment pointer vers le type double si le processeur ne le prend pas en charge. |
s32FloatDef
Déclaration: | var s32FloatDef: PFloatDef; |
Description: | Définition de type pour une valeur en virgule flottante 32-bit IEEE (single) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. Cela pourrait ne pas vraiment pointer vers le type single si le processeur ne le prend pas en charge. |
s80FloatDef
Déclaration: | var s80FloatDef : PFloatDef; |
Description: | Définition de type pour une valeur en virgule flottante étendue (extended) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. Cela pourrait ne pas vraiment pointer vers le type extended si le processeur ne le prend pas en charge. |
s32FixedDef
Déclaration: | var s32FixedDef: PFloatDef; |
Description: | Définition de type pour une valeur en virgule fixe 32-bit (fixed) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. Ceci n'est pas supporté officiellement dans FPC 1.0 |
cShortStringDef
Déclaration: | var cShortStringDef: PStringDef; |
Description: | Définition de type pour une valeur chaîne courte (ShortString) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
cLongStringDef
Déclaration: | var cLongStringDef: PStringDef; |
Description: | Définition de type pour une valeur chaîne longue (LongString) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur |
cAnsiStringDef
Déclaration: | var cAnsiStringDef: PStringDef; |
Description: | Définition de type pour une valeur chaîne longue ANSI (AnsiString) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
cWideStringDef
Déclaration: | var cWideStringDef: PStringDef; |
Description: | Définition de type pour une valeur chaîne longue large (2 octets/car., WideString) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
OpenShortStringDef
Déclaration: | var OpenShortStringDef: PStringDef; |
Description: | Définition de type pour une valeur chaîne ouverte (OpenString) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
OpenCharArrayDef
Déclaration: | var OpenCharArrayDef: PArrayDef; |
Description: | Définition de type pour une valeur tableau de caractères ouvert (OpenCharArray) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
VoidPointerDef
Déclaration: | var VoidPointerDef: PPointerDef; |
Description: | Définition de type pour une valeur pointeur qui peut désigner n'importe quoi (Pointer) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
CharPointerDef
Déclaration: | var CharPointerDef: PPointerDef; |
Description: | Définition de type pour une valeur pointeur vers des caractères (PChar) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
VoidFarPointerDef
Déclaration: | var VoidFarPointerDef: PPointerDef; |
Description: | Définition de type pour une valeur pointeur qui peut désigner n'importe quoi (intra-segment) (far Pointer) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
cFormalDef
Déclaration: | var cFormalDef: PFormalDef; |
Description: | |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
cfFileDef
Déclaration: | var cfFileDef: PFileDef; |
Description: | Ceci est le type de fichier par défaut (file) |
Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. |
Prochain chapitre: L'analyseur d'assembleur inline