The parser/fr: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | Retour au contenu [[FPC internals/fr|FPC internals]] | |
| 2 | 2 | ||
| 3 | 3 | # L'analyseur syntaxique | |
| 4 | 4 | ||
| 5 | 5 | *(Dernière mise à jour pour FPC version 1.0.x)* | |
| 6 | 6 | ||
| 7 | 7 | 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. | |
| 8 | 8 | ||
| 9 | 9 | 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 : | |
| 10 | 10 | ||
| 11 | 11 | <http://www.pjh2.de/fpc/CompilerInternalsFigure08.png> | |
| 12 | 12 | ||
| 13 | 13 | ## Information de module | |
| 14 | 14 | ||
| 15 | 15 | *(Dernière mise à jour pour FPC version 1.0.x)* | |
| 16 | 16 | ||
| 17 | 17 | 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. | |
| 18 | 18 | ||
| 19 | 19 | ``` pascal | |
| 20 | 20 | type | |
| 21 | 21 | PModule = ^TModule; | |
| 22 | 22 | TModule = object(TLinkedList_Item) | |
| 23 | 23 | PPUFile: PPPUFile; // Pointer to PPU file object (unit file) | |
| 24 | 24 | Crc: Longint; // CRC-32 bit of the whole PPU file | |
| 25 | 25 | Interface_CRC: Longint; // CRC-32 bit of the interface part of | |
| 26 | 26 | // the PPU file | |
| 27 | 27 | Flags: Longint; // Unit file flags | |
| 28 | 28 | Compiled: Boolean; // TRUE if module is already compiled | |
| 29 | 29 | Do_Reload: Boolean; // TRUE if the PPU file must be reloaded | |
| 30 | 30 | Do_Assemble: Boolean; // Only assemble, don’t recompile unit | |
| 31 | 31 | Sources_Avail: Boolean; // TRUE if all sources of module are available | |
| 32 | 32 | Sources_Checked: Boolean; // TRUE if the sources has already been checked | |
| 33 | 33 | Is_Unit: Boolean; // TRUE if this is a unit (otherwise a library | |
| 34 | 34 | // or a main program) | |
| 35 | 35 | In_Compile: Boolean; // module is currently being recompiled | |
| 36 | 36 | In_Second_Compile: Boolean; // module is being compiled for second time | |
| 37 | 37 | In_Second_Load: Boolean; // module is being reloaded a second time | |
| 38 | 38 | In_Implementation: Boolean; // currently compiling implementation part | |
| 39 | 39 | // (units only) | |
| 40 | 40 | In_Global: Boolean; // currently compiling implementation part | |
| 41 | 41 | // (units only) | |
| 42 | 42 | Recompile_Reason: TRecompile_Reason; // Reason why module should be recompiled | |
| 43 | 43 | Islibrary: Boolean; // TRUE if this module is a shared library | |
| 44 | 44 | Map: PUnitMap; // Map of all used units for this unit | |
| 45 | 45 | Unitcount: Word; // Internal identifier of unit (for GDB support) | |
| 46 | 46 | Unit_index: Word; | |
| 47 | 47 | Globalsymtable: Pointer; // Symbol table for this module of externally | |
| 48 | 48 | // visible symbols | |
| 49 | 49 | Localsymtable: Pointer; // Symbol table for this module of locally | |
| 50 | 50 | // visible symbols | |
| 51 | 51 | Scanner: Pointer; // Scanner object pointer | |
| 52 | 52 | Loaded_From: PModule; // Module which referred to this module | |
| 53 | 53 | Uses_Imports: Boolean; // TRUE if this module imports symbols | |
| 54 | 54 | // from a shared library | |
| 55 | 55 | Imports: PLinkedList; // Linked list of imported symbols | |
| 56 | 56 | _Exports: PLinkedList; // Linked list of exported symbols (libraries only) | |
| 57 | 57 | SourceFiles: PFileManager; // List of all source files for this module | |
| 58 | 58 | ResourceFiles: TStringContainer; // List of all resource files for this module | |
| 59 | 59 | Used_Units: TLinkedList; // Information on units used by this module | |
| 60 | 60 | // (pused_unit) | |
| 61 | 61 | Dependent_Units: TLinkedList; | |
| 62 | 62 | LocalUnitSearchPath, // Search path for obtaining module source code | |
| 63 | 63 | LocalObjectSearchPath, | |
| 64 | 64 | LocalIncludeSearchPath, // Search path for includes for this module | |
| 65 | 65 | LocalLibrarySearchPath: TSearchPathList; | |
| 66 | 66 | Path: PString; // Path were module is located or created | |
| 67 | 67 | OutputPath: PString; // Path where object files (unit), | |
| 68 | 68 | // executable (program) or | |
| 69 | 69 | // shared library (library) is created | |
| 70 | 70 | ModuleName: PString; // Name of the module in uppercase | |
| 71 | 71 | ObjFileName: PString; // Full name of object file or executable file | |
| 72 | 72 | AsmFileName: PString; // Full name of the assembler file | |
| 73 | 73 | PPUFileName: PString; // Full name of the PPU file | |
| 74 | 74 | StaticLibFilename: PString; // Full name of the static library name | |
| 75 | 75 | // (used when smart linking is used) | |
| 76 | 76 | SharedLibFilename: PString; // Filename of the output shared library | |
| 77 | 77 | // (in the case of a library) | |
| 78 | 78 | ExeFileName: PString; // Filename of the output executable | |
| 79 | 79 | // (in the case of a program) | |
| 80 | 80 | AsmPrefix: PString; // Filename prefix of output assembler | |
| 81 | 81 | // files when using smartlinking | |
| 82 | 82 | MainSource: PString; // Name of the main source file | |
| 83 | 83 | end; | |
| 84 | 84 | ``` | |
| 85 | 85 | ||
| 86 | 86 | ## Types d'analyse | |
| 87 | 87 | ||
| 88 | 88 | *(Dernière mise à jour pour FPC version 1.0.x)* | |
| 89 | 89 | ||
| 90 | 90 | ### Entrée | |
| 91 | 91 | ||
| 92 | 92 | ### Analyse de programme ou de bibliothèque | |
| 93 | 93 | ||
| 94 | 94 | ### Analyse d'unité | |
| 95 | 95 | ||
| 96 | 96 | ### Analyse de routine | |
| 97 | 97 | ||
| 98 | 98 | ### Déclarations d'étiquette | |
| 99 | 99 | ||
| 100 | 100 | ### Déclarations de constante | |
| 101 | 101 | ||
| 102 | 102 | ### Déclarations de type | |
| 103 | 103 | ||
| 104 | 104 | ### Déclarations de variable | |
| 105 | 105 | ||
| 106 | 106 | ### Déclarations de variable thread | |
| 107 | 107 | ||
| 108 | 108 | ### Déclarations de ressource de chaîne | |
| 109 | 109 | ||
| 110 | 110 | ### Déclarations d'exports | |
| 111 | 111 | ||
| 112 | 112 | ### Analyse d'expression | |
| 113 | 113 | ||
| 114 | 114 | ### Déclarations de constante typée | |
| 115 | 115 | ||
| 116 | 116 | ## Interface de l'analyseur | |
| 117 | 117 | ||
| 118 | 118 | *(Dernière mise à jour pour FPC version 1.0.x)* | |
| 119 | 119 | ||
| 120 | 120 | ### variables | |
| 121 | 121 | ||
| 122 | 122 | #### AktProcSym | |
| 123 | 123 | ||
| 124 | 124 | | | | | |
| 125 | 125 | |----|----| | |
| 126 | 126 | | Déclaration: | `var`` AktProcSym: PProcSym;` | | |
| 127 | 127 | | Description: | Pointeur vers l'information de symbole pour la routine en cours d'analyse. | | |
| 128 | 128 | ||
| 129 | 129 | #### LexLevel | |
| 130 | 130 | ||
| 131 | - | ||
| 132 | - | ||
| 133 | - | ||
| 134 | - | ||
| 135 | - | ||
| 136 | - | ||
| 137 | - | ||
| 131 | + | | Déclaration: | `var`` LexLevel: Longint;` | | |
| 132 | + | |---|---| | |
| 133 | + | | Description: | Niveau de code en cours d'analyse et compilé · 0 = pour le programme principal · 1 = pour une sous-routine · 2 = pour des sous-routines locales/imbriquées | | |
| 138 | 134 | ||
| 139 | 135 | #### Current_Module | |
| 140 | 136 | ||
| 141 | 137 | | | | | |
| 142 | 138 | |----|----| | |
| 143 | 139 | | Déclaration: | `var`` Current_Module: PModule;` | | |
| 144 | 140 | | Description: | Information sur le module courant (programme, bibliothèque ou unité) en cours de compilation. | | |
| 145 | 141 | ||
| 146 | 142 | 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: | |
| 147 | 143 | ||
| 148 | 144 | #### VoidDef | |
| 149 | 145 | ||
| 150 | 146 | | | | | |
| 151 | 147 | |----|----| | |
| 152 | 148 | | Déclaration: | `var`` VoidDef: POrdDef;` | | |
| 153 | 149 | | Description: | Pointeur vers le type rien | | |
| 154 | 150 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 155 | 151 | ||
| 156 | 152 | #### cCharDef | |
| 157 | 153 | ||
| 158 | 154 | | | | | |
| 159 | 155 | |----|----| | |
| 160 | 156 | | Déclaration: | `var`` cCharDef: POrdDef;` | | |
| 161 | 157 | | Description: | Définition de type pour un caractère (*char*) | | |
| 162 | 158 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 163 | 159 | ||
| 164 | 160 | #### cWideCharDef | |
| 165 | 161 | ||
| 166 | 162 | | | | | |
| 167 | 163 | |----|----| | |
| 168 | 164 | | Déclaration: | `var`` cWideCharDef: POrdDef;` | | |
| 169 | 165 | | Description: | Définition de type pour un caractère unicode (*WideChar*) | | |
| 170 | 166 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 171 | 167 | ||
| 172 | 168 | #### BoolDef | |
| 173 | 169 | ||
| 174 | 170 | | | | | |
| 175 | 171 | |----|----| | |
| 176 | 172 | | Déclaration: | `var`` BoolDef: POrdDef;` | | |
| 177 | 173 | | Description: | Définition de type pour une valeur booléenne (*boolean*) | | |
| 178 | 174 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 179 | 175 | ||
| 180 | 176 | #### u8BitDef | |
| 181 | 177 | ||
| 182 | 178 | | | | | |
| 183 | 179 | |----|----| | |
| 184 | 180 | | Déclaration: | `var`` u8BitDef: POrdDef;` | | |
| 185 | 181 | | Description: | Deéfinition de type pour une value 8-bit non signée (*byte*) | | |
| 186 | 182 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 187 | 183 | ||
| 188 | 184 | #### u16BitDef | |
| 189 | 185 | ||
| 190 | 186 | | | | | |
| 191 | 187 | |----|----| | |
| 192 | 188 | | Déclaration: | `var`` u16BitDef: POrdDef;` | | |
| 193 | 189 | | Description: | Définition de type pour une valeur 16-bit non signée (*word*) | | |
| 194 | 190 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 195 | 191 | ||
| 196 | 192 | #### u32BitDef | |
| 197 | 193 | ||
| 198 | 194 | | | | | |
| 199 | 195 | |----|----| | |
| 200 | 196 | | Déclaration: | `var`` u32BitDef: POrdDef;` | | |
| 201 | 197 | | Description: | Définition de type pour une valeur 32-bit non signée (*cardinal*) | | |
| 202 | 198 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 203 | 199 | ||
| 204 | 200 | #### s32BitDef | |
| 205 | 201 | ||
| 206 | 202 | | | | | |
| 207 | 203 | |----|----| | |
| 208 | 204 | | Déclaration: | `var`` s32BitDef: POrdDef;` | | |
| 209 | 205 | | Description: | Définition de type pour une valeur 32-bit signée (*Longint*) | | |
| 210 | 206 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 211 | 207 | ||
| 212 | 208 | #### cu64BitDef | |
| 213 | 209 | ||
| 214 | 210 | | | | | |
| 215 | 211 | |----|----| | |
| 216 | 212 | | Déclaration: | `var`` cu64BitDef: POrdDef;` | | |
| 217 | 213 | | Description: | Définition de type pour une valeur 64-bit non signée (*QWord*) | | |
| 218 | 214 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 219 | 215 | ||
| 220 | 216 | #### cs64BitDef | |
| 221 | 217 | ||
| 222 | 218 | | | | | |
| 223 | 219 | |----|----| | |
| 224 | 220 | | Déclaration: | `var`` cs64BitDef: POrdDef;` | | |
| 225 | 221 | | Description: | Définition de type pour une valeur 64-bit signée (*Int64*) | | |
| 226 | 222 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 227 | 223 | ||
| 228 | 224 | #### s64FloatDef | |
| 229 | 225 | ||
| 230 | 226 | | | | | |
| 231 | 227 | |----|----| | |
| 232 | 228 | | Déclaration: | `var`` s64FloatDef: PFloatDef;` | | |
| 233 | 229 | | Description: | Définition de type pour une valeur en virgule flottante 64-bit IEEE (*double*) | | |
| 234 | 230 | | 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. | | |
| 235 | 231 | ||
| 236 | 232 | #### s32FloatDef | |
| 237 | 233 | ||
| 238 | 234 | | | | | |
| 239 | 235 | |----|----| | |
| 240 | 236 | | Déclaration: | `var`` s32FloatDef: PFloatDef;` | | |
| 241 | 237 | | Description: | Définition de type pour une valeur en virgule flottante 32-bit IEEE (*single*) | | |
| 242 | 238 | | 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. | | |
| 243 | 239 | ||
| 244 | 240 | #### s80FloatDef | |
| 245 | 241 | ||
| 246 | 242 | | | | | |
| 247 | 243 | |----|----| | |
| 248 | 244 | | Déclaration: | `var`` s80FloatDef : PFloatDef;` | | |
| 249 | 245 | | Description: | Définition de type pour une valeur en virgule flottante étendue (*extended*) | | |
| 250 | 246 | | 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. | | |
| 251 | 247 | ||
| 252 | 248 | #### s32FixedDef | |
| 253 | 249 | ||
| 254 | 250 | | | | | |
| 255 | 251 | |----|----| | |
| 256 | 252 | | Déclaration: | `var`` s32FixedDef: PFloatDef;` | | |
| 257 | 253 | | Description: | Définition de type pour une valeur en virgule fixe 32-bit (*fixed*) | | |
| 258 | 254 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. Ceci n'est pas supporté officiellement dans FPC 1.0 | | |
| 259 | 255 | ||
| 260 | 256 | #### cShortStringDef | |
| 261 | 257 | ||
| 262 | 258 | | | | | |
| 263 | 259 | |----|----| | |
| 264 | 260 | | Déclaration: | `var`` cShortStringDef: PStringDef;` | | |
| 265 | 261 | | Description: | Définition de type pour une valeur chaîne courte (*ShortString*) | | |
| 266 | 262 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 267 | 263 | ||
| 268 | 264 | #### cLongStringDef | |
| 269 | 265 | ||
| 270 | 266 | | | | | |
| 271 | 267 | |----|----| | |
| 272 | 268 | | Déclaration: | `var`` cLongStringDef: PStringDef;` | | |
| 273 | 269 | | Description: | Définition de type pour une valeur chaîne longue (*LongString*) | | |
| 274 | 270 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur | | |
| 275 | 271 | ||
| 276 | 272 | #### cAnsiStringDef | |
| 277 | 273 | ||
| 278 | 274 | | | | | |
| 279 | 275 | |----|----| | |
| 280 | 276 | | Déclaration: | `var`` cAnsiStringDef: PStringDef;` | | |
| 281 | 277 | | Description: | Définition de type pour une valeur chaîne longue ANSI (*AnsiString*) | | |
| 282 | 278 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 283 | 279 | ||
| 284 | 280 | #### cWideStringDef | |
| 285 | 281 | ||
| 286 | 282 | | | | | |
| 287 | 283 | |----|----| | |
| 288 | 284 | | Déclaration: | `var`` cWideStringDef: PStringDef;` | | |
| 289 | 285 | | Description: | Définition de type pour une valeur chaîne longue large (2 octets/car., *WideString*) | | |
| 290 | 286 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 291 | 287 | ||
| 292 | 288 | #### OpenShortStringDef | |
| 293 | 289 | ||
| 294 | 290 | | | | | |
| 295 | 291 | |----|----| | |
| 296 | 292 | | Déclaration: | `var`` OpenShortStringDef: PStringDef;` | | |
| 297 | 293 | | Description: | Définition de type pour une valeur chaîne ouverte (*OpenString*) | | |
| 298 | 294 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 299 | 295 | ||
| 300 | 296 | #### OpenCharArrayDef | |
| 301 | 297 | ||
| 302 | 298 | | | | | |
| 303 | 299 | |----|----| | |
| 304 | 300 | | Déclaration: | `var`` OpenCharArrayDef: PArrayDef;` | | |
| 305 | 301 | | Description: | Définition de type pour une valeur tableau de caractères ouvert (*OpenCharArray*) | | |
| 306 | 302 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 307 | 303 | ||
| 308 | 304 | #### VoidPointerDef | |
| 309 | 305 | ||
| 310 | 306 | | | | | |
| 311 | 307 | |----|----| | |
| 312 | 308 | | Déclaration: | `var`` VoidPointerDef: PPointerDef;` | | |
| 313 | 309 | | Description: | Définition de type pour une valeur pointeur qui peut désigner n'importe quoi (*Pointer*) | | |
| 314 | 310 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 315 | 311 | ||
| 316 | 312 | #### CharPointerDef | |
| 317 | 313 | ||
| 318 | 314 | | | | | |
| 319 | 315 | |----|----| | |
| 320 | 316 | | Déclaration: | `var`` CharPointerDef: PPointerDef;` | | |
| 321 | 317 | | Description: | Définition de type pour une valeur pointeur vers des caractères (*PChar*) | | |
| 322 | 318 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 323 | 319 | ||
| 324 | 320 | #### VoidFarPointerDef | |
| 325 | 321 | ||
| 326 | 322 | | | | | |
| 327 | 323 | |----|----| | |
| 328 | 324 | | Déclaration: | `var`` VoidFarPointerDef: PPointerDef;` | | |
| 329 | 325 | | Description: | Définition de type pour une valeur pointeur qui peut désigner n'importe quoi (intra-segment) (*far Pointer*) | | |
| 330 | 326 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 331 | 327 | ||
| 332 | 328 | #### cFormalDef | |
| 333 | 329 | ||
| 334 | 330 | | | | | |
| 335 | 331 | |----|----| | |
| 336 | 332 | | Déclaration: | `var`` cFormalDef: PFormalDef;` | | |
| 337 | 333 | | Description: | | | |
| 338 | 334 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 339 | 335 | ||
| 340 | 336 | #### cfFileDef | |
| 341 | 337 | ||
| 342 | 338 | | | | | |
| 343 | 339 | |----|----| | |
| 344 | 340 | | Déclaration: | `var`` cfFileDef: PFileDef;` | | |
| 345 | 341 | | Description: | Ceci est le type de fichier par défaut (*file*) | | |
| 346 | 342 | | Notes: | Ceci est chargé comme un type supporté par défaut pour le compilateur. | | |
| 347 | 343 | ||
| 348 | 344 | Prochain chapitre: [[The inline assembler parser/fr|L'analyseur d'assembleur inline]] | |
| 349 | 345 | ||
| 350 | 346 | --- | |
| 351 | 347 | *From the Free Pascal wiki, page "The parser/fr", as it stood on 2020-12-31 after a change by E-ric, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
