Difference between revisions of "The parse tree/fr"
(Created page with "{{The_parse_tree}} back to contents FPC internals = L'arbre syntaxique = == Architecture == ''(dernière mise à jour pour fpc version 1.0.x)'' The tree is the basis o...") |
|||
(29 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{The_parse_tree}} | {{The_parse_tree}} | ||
− | + | Retour au contenu [[FPC internals/fr|FPC internals]] | |
= L'arbre syntaxique = | = L'arbre syntaxique = | ||
Line 8: | Line 8: | ||
''(dernière mise à jour pour fpc version 1.0.x)'' | ''(dernière mise à jour pour fpc version 1.0.x)'' | ||
− | + | L'arbre est la base du compilateur. Quand le compilateur analyse les instructions et les blocs de code, ils sont convertis en une représentation d'arbre. Cet représentation d' arbre est actuellement une liste doublement chaînée. Depuis cet arbre, la génération de code peut être facilement implémentée. | |
− | + | En supposant que vous avez la syntaxe Pascal suivante : | |
− | + | <tt>x := x * y + (6 shl x);</tt> | |
− | + | L'arbre de structure sera construit en mémoire, où chque cercle représente un élément (un noeud) dans l'arbre : | |
− | + | http://www.pjh2.de/fpc/CompilerInternalsFigure03.png | |
== Types de noeud == | == Types de noeud == | ||
''(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)'' | ''(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)'' | ||
− | + | Les noeuds possible dans l'arbre sont (de type TNodeTyp): | |
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
Line 27: | Line 27: | ||
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | emptynode || | + | | emptynode || Aucun node (retourne nil au chargement depuis le ppu) |
|- | |- | ||
− | | addn || | + | | addn || Répresente l'opérateur + |
|- | |- | ||
− | | muln || | + | | muln || Répresente l'opérateur * |
|- | |- | ||
− | | subn || | + | | subn || Répresente l'opérateur - |
|- | |- | ||
− | | divn || | + | | divn || Répresente l'opérateur <tt>div</tt> |
|- | |- | ||
− | | symdifn || | + | | symdifn || Répresente l'opérateur >< |
|- | |- | ||
− | | modn || | + | | modn || Répresente l'opérateur <tt>mod</tt> |
|- | |- | ||
− | | assignn || | + | | assignn || Répresente l'opérateur := (affectation) |
|- | |- | ||
− | | loadn || | + | | loadn || Répresente l'utilisation d'une variable |
|- | |- | ||
− | | rangen || | + | | rangen || Répresente un intervalle (i.e. 0..9) |
|- | |- | ||
− | | ltn || | + | | ltn || Répresente l'opérateur < |
|- | |- | ||
− | | lten || | + | | lten || Répresente l'opérateur <= |
|- | |- | ||
− | | gtn || | + | | gtn || Répresente l'opérateur > |
|- | |- | ||
− | | gten || | + | | gten || Répresente l'opérateur >= |
|- | |- | ||
− | | equaln || | + | | equaln || Répresente l'opérateur = |
|- | |- | ||
− | | unequaln || | + | | unequaln || Répresente l'opérateur <> |
|- | |- | ||
− | | inn || | + | | inn || Répresente l'opérateur <tt>in</tt> |
|- | |- | ||
− | | orn || | + | | orn || Répresente l'opérateur <tt>or</tt> |
|- | |- | ||
− | | xorn || | + | | xorn || Répresente l'opérateur <tt>xor</tt> |
|- | |- | ||
− | | shrn || | + | | shrn || Répresente l'opérateur <tt>shr</tt> |
|- | |- | ||
− | | shln || | + | | shln || Répresente l'opérateur <tt>shl</tt> |
|- | |- | ||
− | | slashn || | + | | slashn || Répresente l'opérateur / |
|- | |- | ||
− | | andn || | + | | andn || Répresente l'opérateur <tt>and</tt> |
|- | |- | ||
− | | subscriptn || | + | | subscriptn || Répresente un champ dans un oibjet ou un enregistrement |
|- | |- | ||
− | | derefn || | + | | derefn || Répresente une déréférence de pointeur (telle qu'avec l'opérateur ^) |
|- | |- | ||
− | | addrn || | + | | addrn || Répresente l'opérateur @ |
|- | |- | ||
− | | ordconstn || | + | | ordconstn || Représente une constante ordinale |
|- | |- | ||
− | | typeconvn || | + | | typeconvn || Représente une conversion de type |
|- | |- | ||
− | | calln || | + | | calln || Représente un appel de routine |
|- | |- | ||
− | | callparan || | + | | callparan || Représente un paramètre passé à une routine |
|- | |- | ||
− | | realconstn || | + | | realconstn || Représente une constante en virgule flottante |
|- | |- | ||
− | | unaryminusn || | + | | unaryminusn || Représente un signe négatif (p.ex. : -) |
|- | |- | ||
− | | asmn || | + | | asmn || Représente un noeud d'instruction assembleur |
|- | |- | ||
− | | vecn || | + | | vecn || Représente l'indexation d'un tableau |
|- | |- | ||
− | | pointerconstn || | + | | pointerconstn || Représente une constante de type pointer |
|- | |- | ||
− | | stringconstn || | + | | stringconstn || Représente une constante de type string |
|- | |- | ||
− | | notn || | + | | notn || Répresente l'opérateur <tt>not</tt> |
|- | |- | ||
− | | inlinen || | + | | inlinen || Répresente une des routines internes (writeln,ord,etc.) |
|- | |- | ||
− | | niln || | + | | niln || Représente le pointeur <tt>nil</tt> |
|- | |- | ||
− | | errorn || | + | | errorn || Représente une erreur dans l'analyse de ce noeud (utilisé pour la détection d'erreur et la correction) |
|- | |- | ||
− | | typen || | + | | typen || Représente un nom de type (i.e typeof(obj)) |
|- | |- | ||
− | | setelementn || | + | | setelementn || Représente des ensembles d'éléments (i.e : [a..b], [a,b,c]) (non constant) |
|- | |- | ||
− | | setconstn || | + | | setconstn || Représente un ensemble d'éléments constants i.e : [1..9], [1,2,3]) |
|- | |- | ||
− | | blockn || | + | | blockn || Représente un bloc d'instructions |
|- | |- | ||
− | | statementn || | + | | statementn || Représente une instruction dans un bloc de noeuds |
|- | |- | ||
− | | ifn || | + | | ifn || Représente une instruction <tt>if</tt> |
|- | |- | ||
− | | breakn || | + | | breakn || Représente une instruction <tt>break</tt> |
|- | |- | ||
− | | continuen || | + | | continuen || Représente une instruction <tt>continue</tt> |
|- | |- | ||
− | | whilerepeatn || | + | | whilerepeatn || Représente une instruction <tt>while</tt> ou <tt>repeat</tt> |
|- | |- | ||
− | | forn || | + | | forn || Représente une instruction <tt>for</tt> |
|- | |- | ||
− | | exitn || | + | | exitn || Représente une instruction <tt>exit</tt> |
|- | |- | ||
− | | withn || | + | | withn || Représente une instruction <tt>with</tt> |
|- | |- | ||
− | | casen || | + | | casen || Représente une instruction <tt>case</tt> |
|- | |- | ||
− | | labeln || | + | | labeln || Représente une instruction <tt>label</tt> |
|- | |- | ||
− | | goton || | + | | goton || Représente une instruction <tt>goto</tt> |
|- | |- | ||
− | | tryexceptn || | + | | tryexceptn || Représente une instruction <tt>try..except</tt> |
|- | |- | ||
− | | raisen || | + | | raisen || Représente une instruction <tt>raise</tt> |
|- | |- | ||
− | | tryfinallyn || | + | | tryfinallyn || Représente une instruction <tt>try..finally</tt> |
|- | |- | ||
− | | onn || | + | | onn || Représente une instruction <tt>on..do</tt> (dans le code de traitement d'une exception) |
|- | |- | ||
− | | isn || | + | | isn || Répresente l'opérateur <tt>is</tt> |
|- | |- | ||
− | | asn || | + | | asn || Répresente l'opérateur de conversion de type <tt>as</tt> |
|- | |- | ||
− | | caretn || | + | | caretn || Répresente l'opérateur ^ |
|- | |- | ||
− | | starstarn || | + | | starstarn || Répresente l'opérateur ** (exponentiation) |
|- | |- | ||
− | | arrayconstructorn || | + | | arrayconstructorn || Répresente un noeud de construction pour l'analyse de for [...] |
|- | |- | ||
− | | arrayconstructorrangen || | + | | arrayconstructorrangen || Elément d'intervalle pour permettre aux ensembles dans l'arbre de construction d'un tableau |
|- | |- | ||
− | | tempcreaten || | + | | tempcreaten || pour les temporaires dans le result/firstpass |
|- | |- | ||
− | | temprefn || | + | | temprefn || Références vers temporaires. |
|- | |- | ||
− | | tempdeleten || | + | | tempdeleten || Pour les temporaires dans le result/firstpass |
|- | |- | ||
− | | addoptn || | + | | addoptn || Ajouté pour les optimisations où nous ne pouvons pas supprimer. |
|- | |- | ||
− | | nothingn || NOP, | + | | nothingn || NOP, Ne fait rien |
|- | |- | ||
− | | loadvmtaddrn || | + | | loadvmtaddrn || Charge l'adresse de la VMT d'une classe/d'un objet |
|- | |- | ||
− | | guidconstn || | + | | guidconstn || Une constante GUID d'interface COM |
|- | |- | ||
− | | rttin || Rtti | + | | rttin || Informations Rtti pour qu'elles soient accessibles dans result/firstpass |
|- | |- | ||
− | | loadparentfpn || | + | | loadparentfpn || Charge le framepointer du parent pour les procédures imbriquées. |
|} | |} | ||
− | |||
== Champs de structure de noeud (node.pas) == | == Champs de structure de noeud (node.pas) == | ||
Line 183: | Line 182: | ||
TNode = <b>class</b> | TNode = <b>class</b> | ||
public | public | ||
− | NodeType: TNodeType; // type | + | NodeType: TNodeType; // type de ce noeud |
− | BlockType: TBlock_Type; // type | + | BlockType: TBlock_Type; // type du bloc de code courant, général/const/type |
− | ExpectLoc: TCGLoc; // | + | ExpectLoc: TCGLoc; // emplacement attendu du résultat de ce noeud (pass1) |
− | Location: TLocation; // | + | Location: TLocation; // l'emplacement du résultat de ce noeud (pass2) |
− | Parent: TNode; // | + | Parent: TNode; // le noeud parent de ce noeud |
− | // | + | // ce champ est est défini par concattolist |
− | Flags: TNodeFlags; // | + | Flags: TNodeFlags; // il y a quelques propriétés sur la noeud enregistré |
PpuIdx: Longint; | PpuIdx: Longint; | ||
− | RegistersInt, // | + | RegistersInt, // le nombre de registres nécessaires pour évaluer ce noeud |
RegistersFpu, | RegistersFpu, | ||
− | RegistersMm: Longint; // | + | RegistersMm: Longint; // doit être longint !!!! |
{$ifdef SUPPORT_MMX} | {$ifdef SUPPORT_MMX} | ||
RegistersMmx: Longint; | RegistersMmx: Longint; | ||
Line 214: | Line 213: | ||
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | nf_swapable || TBinOp || | + | | nf_swapable || TBinOp || Les opếrandes peuvent être échangées |
|- | |- | ||
− | | nf_swaped || TBinOp || | + | | nf_swaped || TBinOp || Les opérandes sont échangées |
|- | |- | ||
− | | nf_error || || | + | | nf_error || || Mis à TRUE s'il y a eu une erreur en analysant ce noeud |
|- | |- | ||
− | | nf_pass1_done || | + | | nf_pass1_done || général || |
|- | |- | ||
− | | nf_write || | + | | nf_write || général || Le noeud est écrit vers |
|- | |- | ||
− | | nf_isproperty || | + | | nf_isproperty || général || TRUE si c'est une propriété |
|- | |- | ||
| nf_typedaddr || TAddrNode || | | nf_typedaddr || TAddrNode || | ||
Line 256: | Line 255: | ||
| nf_explicit || TTypeConvNode || | | nf_explicit || TTypeConvNode || | ||
|- | |- | ||
− | | nf_internal || TTypeConvNode || | + | | nf_internal || TTypeConvNode || Aucun avertissement/conseil n'a été généré. |
|- | |- | ||
| nf_load_procvar || TTypeConvNode || | | nf_load_procvar || TTypeConvNode || | ||
Line 266: | Line 265: | ||
| nf_block_with_exit || TBlockNode || | | nf_block_with_exit || TBlockNode || | ||
|} | |} | ||
− | |||
=== TLocalSwitches === | === TLocalSwitches === | ||
''(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)'' | ''(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)'' | ||
− | + | Génération de code | |
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Commutateur |
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Paramètre |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | cs_check_overflow || {$Q+} || -Co || | + | | cs_check_overflow || {$Q+} || -Co || Le générateur de code devrait émettre du code de contrôle de débordement |
|- | |- | ||
− | | cs_check_range || {$R+} || -Cr, -CR || | + | | cs_check_range || {$R+} || -Cr, -CR || Le générateur de code devrait émettre du code de contrôle des intervalles |
|- | |- | ||
− | | cs_check_object || || -CR || | + | | cs_check_object || || -CR || Le générateur de code devrait émettre du code pour vérifier la validité des appels de méthode |
|- | |- | ||
− | | cs_check_io || {$I+} || -Ci || | + | | cs_check_io || {$I+} || -Ci || Le générateur de code devrait émettre du code de contrôle des E/S |
|- | |- | ||
− | | cs_check_stack || {$S+} || -Ct || | + | | cs_check_stack || {$S+} || -Ct || Le générateur de code devrait émettre du code de cvontrôle de la pile |
|- | |- | ||
− | | cs_checkpointer || || -gc || | + | | cs_checkpointer || || -gc || Le générateur de code devrait émettre du code de contrôle de pointeur |
|- | |- | ||
− | | cs_omitstackframe || N/A || || | + | | cs_omitstackframe || N/A || || Le générateur de code ne devrait pas émettre du code d'installation de frame_pointer (''frame_pointer setup'') dans le code d'entrée (''entry code'') (n'est pas utilisé dans le compilateur) |
|- | |- | ||
− | | cs_do_assertion || {$C+} || -Sa || | + | | cs_do_assertion || {$C+} || -Sa || Le générateur de code supporte l'utilisation de la routine en-ligne assert (''assert inline routine'') |
|- | |- | ||
− | | cs_generate_rtti || {$M+} || || | + | | cs_generate_rtti || {$M+} || || Le générateur de code devrait émettre de l'information de type à l'exécution (''runtime type information'') |
|- | |- | ||
− | | cs_full_boolean_eval || {$B+} || || | + | | cs_full_boolean_eval || {$B+} || || Mode d'évaluation des booléens |
|- | |- | ||
| cs_typed_const_writable || {$J+} || || '''''todo''''' | | cs_typed_const_writable || {$J+} || || '''''todo''''' | ||
Line 307: | Line 305: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Commutateur |
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Paramètre |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | cs_mmx || {$MMX+} || || | + | | cs_mmx || {$MMX+} || || Le générateur de code peut utiliser des commandes MMX |
|- | |- | ||
− | | cs_mmx_saturation || {$SATURATION+} || || | + | | cs_mmx_saturation || {$SATURATION+} || || Le générateur de code peut utiliser des opérations saturées (MMX) |
|} | |} | ||
Line 319: | Line 317: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Commutateur |
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Paramètre |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | cs_typed_addresses || {$T+} || || | + | | cs_typed_addresses || {$T+} || || L'analyseur émets des pointeurs typés utilisant l'opérateur @ |
|- | |- | ||
− | | cs_strict_var_strings || {$V+} || || String | + | | cs_strict_var_strings || {$V+} || || Les types String doivent être identiques (même longueur) pour être compatibles |
|- | |- | ||
− | | cs_ansistrings || {$H+} || -Sh || | + | | cs_ansistrings || {$H+} || -Sh || L'analyseur créée une ansistring quand un type de String non spécifié est déclaré au lieu de ShortString par défaut |
|} | |} | ||
Line 334: | Line 332: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ! style="background:#f0f0f0;text-align:left;" | TLocalSwitches | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Commutateur |
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Paramètre |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
Line 343: | Line 341: | ||
|} | |} | ||
− | === | + | === Champs supplémentaires === |
(dernière mise à jour pour fpc version 1.0.x) | (dernière mise à jour pour fpc version 1.0.x) | ||
− | + | Selon le type de l'arbre, quelques champs supplémentaires peuvent être présents dans le noeud de l'arbre. Cette section décrit ces champs additionnels. Avant d'accéder à ces champs additionnels, un contrôle de type de l'arbre doit toujours être fait pour vérifier si on ne lit pas des intervalles de mémoires invalides. | |
==== AddN ==== | ==== AddN ==== | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Use_StrConcat: Boolean; || '' | + | | Use_StrConcat: Boolean; || ''Actuellement inutilisé (usage pour l'optimisation dans des versions futures)'' |
|- | |- | ||
− | | String_Typ: TStringType; || | + | | String_Typ: TStringType; || Au cas où l'opérateur + est appliqué sur une String, ce champ indique le type de string. |
|} | |} | ||
Line 362: | Line 360: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Is_Colon_Para : Boolean; || | + | | Is_Colon_Para : Boolean; || Utilisé par des routines internes qui peuvent utiliser des paramètres de format optionnels (utilisant des :). Défini à TRUE si ce paramètre est précédé par : (i.e. : :1) (voir [[https://wiki.freepascal.org/Write#Signature]] par exemple). |
|- | |- | ||
− | | Exact_Match_Found : Boolean; || Set to TRUE if the parameter type is exactly the same as the one expected by the routine. | + | | Exact_Match_Found : Boolean; || Défini à TRUE si le type du paramètre est est exactement Set to TRUE if the parameter type is exactly the same as the one expected by the routine. |
|- | |- | ||
− | | ConvLevel1Found : Boolean; || | + | | ConvLevel1Found : Boolean; || Défini à TRUE si le type du paramètre nécessite une conversion de type de niveau 1 pour être conforme au paramètre attendu par la routine. |
|- | |- | ||
− | | ConvLevel2Found : Boolean; || | + | | ConvLevel2Found : Boolean; || Défini à TRUE si le type du paramètre nécessite une conversion de type de niveau 2 pour être conforme au paramètre attendu par la routine. |
|- | |- | ||
| HighTree : pTree; || | | HighTree : pTree; || | ||
Line 379: | Line 377: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | AssignTyp: TAssignTyp; || | + | | AssignTyp: TAssignTyp; || Inutilisé actuellement (Mis en place pour être utilisé dans les affectations à la façon C) |
|- | |- | ||
− | | Concat_String: Boolean; || | + | | Concat_String: Boolean; || Inutilisé actuellement (utilisé pour des optimisations dans des versions futures) |
|} | |} | ||
Line 390: | Line 388: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | SymTableEntry: PSym; || | + | | SymTableEntry: PSym; || Entrée de table de symbole pour ce symbole |
|- | |- | ||
− | | SymTable: PSymTable; || | + | | SymTable: PSymTable; || Table de symbole dans lequel ce symbole est enregistré |
|- | |- | ||
− | | Is_Absolute: Boolean; || | + | | Is_Absolute: Boolean; || Mis à TRUE si cette variable est [[Absolute/fr|absolute]]. |
|- | |- | ||
− | | Is_First: Boolean; || | + | | Is_First: Boolean; || Mis à TRUE si c'est la première occurence du chargement de cette variable (utilisé avec variable varstate pour des optimisations) |
|} | |} | ||
Line 405: | Line 403: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | SymTableProcEntry: PProcSym; || | + | | SymTableProcEntry: PProcSym; || Entrée de table de symboles pour cette routine |
|- | |- | ||
− | | SymTableProc: PSymTable; || | + | | SymTableProc: PSymTable; || Table de symbole associé à un appel (table de symboles objet ou table de symboles de routine) |
|- | |- | ||
− | | ProcDefinition: pAbstractProcDef; || | + | | ProcDefinition: pAbstractProcDef; || Définition de type pour cette routine |
|- | |- | ||
| MethodPointer: pTree; || ????????? | | MethodPointer: pTree; || ????????? | ||
|- | |- | ||
− | | No_Check: Boolean; || '' | + | | No_Check: Boolean; || ''inutilisé actuellement'' |
|- | |- | ||
− | | Unit_Specific: Boolean; || | + | | Unit_Specific: Boolean; || Mis à TRUE si cette routine est importée d'une unité de manière spécifique (p.ex.: system.writeln()) |
|- | |- | ||
− | | Return_Value_Used : Boolean || | + | | Return_Value_Used : Boolean || Mis à TRUE si la routine est une fonction et que la vaelur retournée n'est pas utilisée (dans l'analyse de syntaxe étendue - $X+) |
|- | |- | ||
− | | Static_Call: Boolean; || '' | + | | Static_Call: Boolean; || ''inutilisé'' |
|} | |} | ||
Line 428: | Line 426: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | ProcVarLoad: Boolean; || | + | | ProcVarLoad: Boolean; || Mis à TRUE si c'est un appel de variable procédurale |
|} | |} | ||
Line 437: | Line 435: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Value: LongInt; || | + | | Value: LongInt; || La valeur numérique de ce noeud constante |
|} | |} | ||
Line 446: | Line 444: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Value_Real: Best_Real; || | + | | Value_Real: Best_Real; || La valeur numérique de ce noeud constante |
|- | |- | ||
− | | Lab_Real: PAsmLabel; || | + | | Lab_Real: PAsmLabel; || La référence d'étiquette Assembleur pour cette constante |
|} | |} | ||
Line 457: | Line 455: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Value_Fix: LongInt; || | + | | Value_Fix: LongInt; || La valeur numérique de ce noeud constante |
|} | |} | ||
Line 466: | Line 464: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | FuncRetProcInfo: Pointer; (PProcInfo) || | + | | FuncRetProcInfo: Pointer; (PProcInfo) || Pointeur vers l'information de procédure |
|- | |- | ||
− | | RetType: TType; || | + | | RetType: TType; || Indique le type de retour de la fonction |
|- | |- | ||
| Is_First_FuncRet: Boolean; || | | Is_First_FuncRet: Boolean; || | ||
Line 479: | Line 477: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | vs: pVarSym; || | + | | vs: pVarSym; || Entrée de table de symboles pour cette variable (un champ d'objet/de classe/d'enregistrement) |
|} | |} | ||
Line 488: | Line 486: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | FrameTree: PTree; || | + | | FrameTree: PTree; || Arbre du cadre d'exception (code dans l'instruction Raise) |
|} | |} | ||
Line 497: | Line 495: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | MemIndex: Boolean; || | + | | MemIndex: Boolean; || Mis à TRUE si la directive Mem[Seg:Ofs] est analysée |
|- | |- | ||
− | | MemSeg: Boolean; || | + | | MemSeg: Boolean; || Mis à TRUE si la directive Mem[Seg:Ofs] est analysée |
|- | |- | ||
| CallUnique: Boolean; || | | CallUnique: Boolean; || | ||
Line 510: | Line 508: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Value_Str: PChar; || | + | | Value_Str: PChar; || La valeur constante de la chaîne |
|- | |- | ||
− | | Length: LongInt; || | + | | Length: LongInt; || Longueur de la chaîne en octets (ou en caractères ?) |
|- | |- | ||
− | | Lab_Str: PAsmLabel; || | + | | Lab_Str: PAsmLabel; || La référence de l'étiquette assembleur de cette constante |
|- | |- | ||
− | | StringType: TStringType; || | + | | StringType: TStringType; || Le type de la chaîne (short, long, ansi, wide) |
|} | |} | ||
Line 525: | Line 523: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | ConvType: TConvertType; || | + | | ConvType: TConvertType; || Indique la conversion de type à réaliser |
|- | |- | ||
− | | Explizit: Boolean; || | + | | Explizit: Boolean; || Mis à TRUE si cela était une conversion explicite (avec un typecast explicite, ou en appelant une des routines de conversion internes) |
|} | |} | ||
Line 536: | Line 534: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | TypeNodeType: PDef; || | + | | TypeNodeType: PDef; || La définition de type pour ce noeud |
|- | |- | ||
− | | TypeNodeSym: PTypeSym; || | + | | TypeNodeSym: PTypeSym; || L'information de type du symbole |
|} | |} | ||
Line 547: | Line 545: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | InlineNumber: Byte; || | + | | InlineNumber: Byte; || Indique la routine interne appelée (Cf. générateur de code) |
|- | |- | ||
− | | InlineConst: Boolean; || | + | | InlineConst: Boolean; || Un ou plusieurs des paramètres pour cet appel de routine inline contient des valeurs constantes |
|} | |} | ||
==== ProcInlineN ==== | ==== ProcInlineN ==== | ||
− | + | Les noeuds inline sont créés quand une routine est déclarée comme étant inline. La routine est effectivement inline-ée quand les conditions suivantes sont satisfaites: | |
− | + | * C'est un appel à l'intérieur du même module | |
− | + | * Le commutateur approprié du compilateur est activé | |
− | + | * La routine n'est pas une méthode (i.e. c'est une procédure ou une fonction normale) | |
− | + | Sinon, un appel normal est fait, ignorant la directive inline. Dans le cas où la routine est inline-ée, tous les paramètres, valeurs de retour et variables locales de la routine inline sont effectivement alloués dans l'espace de la pile de la routine dans laquelle l'appel inline est fait (dite routine parent plus bas). | |
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | InlineTree: PTree; || | + | | InlineTree: PTree; || L'arbre complet pour cette routine inline |
|- | |- | ||
− | | InlineProcsym: PProcSym; || | + | | InlineProcsym: PProcSym; || Entrée de table de symboles pour cette routine |
|- | |- | ||
− | | RetOffset: LongInt; || | + | | RetOffset: LongInt; || Décalage du retour dans l'espace de la pile de la routine parent |
|- | |- | ||
− | | Para_Offset: LongInt; || | + | | Para_Offset: LongInt; || Décalage du paramètre de départ dans l'espace de la pile de la routine parent |
|- | |- | ||
− | | Para_Size: LongInt; || | + | | Para_Size: LongInt; || Taille du paramètre dans l'espace de la pile de la routine parent |
|} | |} | ||
Line 585: | Line 583: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Value_Set: PConstSet; || | + | | Value_Set: PConstSet; || La valeur numérique de ce noeud constante |
|- | |- | ||
− | | Lab_Set: PAsmLabel; || | + | | Lab_Set: PAsmLabel; || La référence de l'étiquette assembleur pour cette constante |
|} | |} | ||
Line 596: | Line 594: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
Line 605: | Line 603: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | p_Asm: PAasmOutput; || | + | | p_Asm: PAasmOutput; || L'arbre d'instruction créé par l'analyseur assembelur |
|- | |- | ||
− | | Object_Preserved: Boolean; || | + | | Object_Preserved: Boolean; || Mis à FALSE si le Self_Register a été modifié dans l'instruction asm |
|} | |} | ||
Line 616: | Line 614: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | Nodes: PCaseRecord; || | + | | Nodes: PCaseRecord; || Arbre de chaque alternative possible dans une instruction case |
|- | |- | ||
− | | ElseBlock: PTree; || Else | + | | ElseBlock: PTree; || Arbre du bloc d'instructions Else |
|} | |} | ||
Line 627: | Line 625: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
− | | LabelNr: PAsmLabel; || | + | | LabelNr: PAsmLabel; || Etiquette Assembleur associée avec l'instruction |
|- | |- | ||
| ExceptionBlock: PTree; || ? | | ExceptionBlock: PTree; || ? | ||
|- | |- | ||
− | | LabSym: PLabelSym; || | + | | LabSym: PLabelSym; || Entrée de table de symboles pour cette étiquette |
|} | |} | ||
Line 640: | Line 638: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
Line 655: | Line 653: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
Line 666: | Line 664: | ||
{| border="1" cellpadding="3" cellspacing="0" | {| border="1" cellpadding="3" cellspacing="0" | ||
− | ! style="background:#f0f0f0;text-align:left;" | | + | ! style="background:#f0f0f0;text-align:left;" | Champ |
! style="background:#f0f0f0;text-align:left;" | Description | ! style="background:#f0f0f0;text-align:left;" | Description | ||
|- | |- | ||
Line 681: | Line 679: | ||
− | + | Prochain chapitre: [[Symbol tables/fr|Table des symboles]] |
Latest revision as of 11:54, 24 December 2020
│
English (en) │
français (fr) │
Retour au contenu FPC internals
L'arbre syntaxique
Architecture
(dernière mise à jour pour fpc version 1.0.x)
L'arbre est la base du compilateur. Quand le compilateur analyse les instructions et les blocs de code, ils sont convertis en une représentation d'arbre. Cet représentation d' arbre est actuellement une liste doublement chaînée. Depuis cet arbre, la génération de code peut être facilement implémentée.
En supposant que vous avez la syntaxe Pascal suivante :
x := x * y + (6 shl x);
L'arbre de structure sera construit en mémoire, où chque cercle représente un élément (un noeud) dans l'arbre :
http://www.pjh2.de/fpc/CompilerInternalsFigure03.png
Types de noeud
(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)
Les noeuds possible dans l'arbre sont (de type TNodeTyp):
Tree type definition | Description |
---|---|
emptynode | Aucun node (retourne nil au chargement depuis le ppu) |
addn | Répresente l'opérateur + |
muln | Répresente l'opérateur * |
subn | Répresente l'opérateur - |
divn | Répresente l'opérateur div |
symdifn | Répresente l'opérateur >< |
modn | Répresente l'opérateur mod |
assignn | Répresente l'opérateur := (affectation) |
loadn | Répresente l'utilisation d'une variable |
rangen | Répresente un intervalle (i.e. 0..9) |
ltn | Répresente l'opérateur < |
lten | Répresente l'opérateur <= |
gtn | Répresente l'opérateur > |
gten | Répresente l'opérateur >= |
equaln | Répresente l'opérateur = |
unequaln | Répresente l'opérateur <> |
inn | Répresente l'opérateur in |
orn | Répresente l'opérateur or |
xorn | Répresente l'opérateur xor |
shrn | Répresente l'opérateur shr |
shln | Répresente l'opérateur shl |
slashn | Répresente l'opérateur / |
andn | Répresente l'opérateur and |
subscriptn | Répresente un champ dans un oibjet ou un enregistrement |
derefn | Répresente une déréférence de pointeur (telle qu'avec l'opérateur ^) |
addrn | Répresente l'opérateur @ |
ordconstn | Représente une constante ordinale |
typeconvn | Représente une conversion de type |
calln | Représente un appel de routine |
callparan | Représente un paramètre passé à une routine |
realconstn | Représente une constante en virgule flottante |
unaryminusn | Représente un signe négatif (p.ex. : -) |
asmn | Représente un noeud d'instruction assembleur |
vecn | Représente l'indexation d'un tableau |
pointerconstn | Représente une constante de type pointer |
stringconstn | Représente une constante de type string |
notn | Répresente l'opérateur not |
inlinen | Répresente une des routines internes (writeln,ord,etc.) |
niln | Représente le pointeur nil |
errorn | Représente une erreur dans l'analyse de ce noeud (utilisé pour la détection d'erreur et la correction) |
typen | Représente un nom de type (i.e typeof(obj)) |
setelementn | Représente des ensembles d'éléments (i.e : [a..b], [a,b,c]) (non constant) |
setconstn | Représente un ensemble d'éléments constants i.e : [1..9], [1,2,3]) |
blockn | Représente un bloc d'instructions |
statementn | Représente une instruction dans un bloc de noeuds |
ifn | Représente une instruction if |
breakn | Représente une instruction break |
continuen | Représente une instruction continue |
whilerepeatn | Représente une instruction while ou repeat |
forn | Représente une instruction for |
exitn | Représente une instruction exit |
withn | Représente une instruction with |
casen | Représente une instruction case |
labeln | Représente une instruction label |
goton | Représente une instruction goto |
tryexceptn | Représente une instruction try..except |
raisen | Représente une instruction raise |
tryfinallyn | Représente une instruction try..finally |
onn | Représente une instruction on..do (dans le code de traitement d'une exception) |
isn | Répresente l'opérateur is |
asn | Répresente l'opérateur de conversion de type as |
caretn | Répresente l'opérateur ^ |
starstarn | Répresente l'opérateur ** (exponentiation) |
arrayconstructorn | Répresente un noeud de construction pour l'analyse de for [...] |
arrayconstructorrangen | Elément d'intervalle pour permettre aux ensembles dans l'arbre de construction d'un tableau |
tempcreaten | pour les temporaires dans le result/firstpass |
temprefn | Références vers temporaires. |
tempdeleten | Pour les temporaires dans le result/firstpass |
addoptn | Ajouté pour les optimisations où nous ne pouvons pas supprimer. |
nothingn | NOP, Ne fait rien |
loadvmtaddrn | Charge l'adresse de la VMT d'une classe/d'un objet |
guidconstn | Une constante GUID d'interface COM |
rttin | Informations Rtti pour qu'elles soient accessibles dans result/firstpass |
loadparentfpn | Charge le framepointer du parent pour les procédures imbriquées. |
Champs de structure de noeud (node.pas)
(dernière mise à jour pour fpc version fpc version 2.1.1, 2005-06-11)
type TNode = class public NodeType: TNodeType; // type de ce noeud BlockType: TBlock_Type; // type du bloc de code courant, général/const/type ExpectLoc: TCGLoc; // emplacement attendu du résultat de ce noeud (pass1) Location: TLocation; // l'emplacement du résultat de ce noeud (pass2) Parent: TNode; // le noeud parent de ce noeud // ce champ est est défini par concattolist Flags: TNodeFlags; // il y a quelques propriétés sur la noeud enregistré PpuIdx: Longint; RegistersInt, // le nombre de registres nécessaires pour évaluer ce noeud RegistersFpu, RegistersMm: Longint; // doit être longint !!!! {$ifdef SUPPORT_MMX} RegistersMmx: Longint; {$endif SUPPORT_MMX} ResultType: TType; FileInfo: TFilePosInfo; LocalSwitches: TLocalSwitches; {$ifdef extdebug} MaxFirstPassCount, FirstPassCount: Longint; {$endif extdebug} end;
TNodeFlag
(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)
TNodeType | Description | |
---|---|---|
nf_swapable | TBinOp | Les opếrandes peuvent être échangées |
nf_swaped | TBinOp | Les opérandes sont échangées |
nf_error | Mis à TRUE s'il y a eu une erreur en analysant ce noeud | |
nf_pass1_done | général | |
nf_write | général | Le noeud est écrit vers |
nf_isproperty | général | TRUE si c'est une propriété |
nf_typedaddr | TAddrNode | |
nf_no_checkpointer | TDerefNode | |
nf_memindex | TVecNode | |
nf_memseg | TVecNode | |
nf_callunique | TVecNode | |
nf_absolute | TLoadNode | |
nf_is_self | TLoadNode | |
nf_load_self_pointer | TLoadNode | |
nf_is_currency | TAddNode | |
nf_has_pointerdiv | TAddNode | |
nf_concat_string | TAssignmentNode | |
nf_use_strconcat | TAssignmentNode | |
nf_forcevaria | TArrayConstructNode | |
nf_novariaallowed | TArrayConstructNode | |
nf_explicit | TTypeConvNode | |
nf_internal | TTypeConvNode | Aucun avertissement/conseil n'a été généré. |
nf_load_procvar | TTypeConvNode | |
nf_inlineconst | TInlineNode | |
nf_get_asm_position | TAsmNode | |
nf_block_with_exit | TBlockNode |
TLocalSwitches
(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)
Génération de code
TLocalSwitches | Commutateur | Paramètre | Description |
---|---|---|---|
cs_check_overflow | {$Q+} | -Co | Le générateur de code devrait émettre du code de contrôle de débordement |
cs_check_range | {$R+} | -Cr, -CR | Le générateur de code devrait émettre du code de contrôle des intervalles |
cs_check_object | -CR | Le générateur de code devrait émettre du code pour vérifier la validité des appels de méthode | |
cs_check_io | {$I+} | -Ci | Le générateur de code devrait émettre du code de contrôle des E/S |
cs_check_stack | {$S+} | -Ct | Le générateur de code devrait émettre du code de cvontrôle de la pile |
cs_checkpointer | -gc | Le générateur de code devrait émettre du code de contrôle de pointeur | |
cs_omitstackframe | N/A | Le générateur de code ne devrait pas émettre du code d'installation de frame_pointer (frame_pointer setup) dans le code d'entrée (entry code) (n'est pas utilisé dans le compilateur) | |
cs_do_assertion | {$C+} | -Sa | Le générateur de code supporte l'utilisation de la routine en-ligne assert (assert inline routine) |
cs_generate_rtti | {$M+} | Le générateur de code devrait émettre de l'information de type à l'exécution (runtime type information) | |
cs_full_boolean_eval | {$B+} | Mode d'évaluation des booléens | |
cs_typed_const_writable | {$J+} | todo | |
cs_allow_enum_calc | todo |
MMX
TLocalSwitches | Commutateur | Paramètre | Description |
---|---|---|---|
cs_mmx | {$MMX+} | Le générateur de code peut utiliser des commandes MMX | |
cs_mmx_saturation | {$SATURATION+} | Le générateur de code peut utiliser des opérations saturées (MMX) |
Parser
TLocalSwitches | Commutateur | Paramètre | Description |
---|---|---|---|
cs_typed_addresses | {$T+} | L'analyseur émets des pointeurs typés utilisant l'opérateur @ | |
cs_strict_var_strings | {$V+} | Les types String doivent être identiques (même longueur) pour être compatibles | |
cs_ansistrings | {$H+} | -Sh | L'analyseur créée une ansistring quand un type de String non spécifié est déclaré au lieu de ShortString par défaut |
MACPAS specific
TLocalSwitches | Commutateur | Paramètre | Description |
---|---|---|---|
cs_external_var | {$J+} | todo | |
cs_externally_visible | {$Z+} | todo |
Champs supplémentaires
(dernière mise à jour pour fpc version 1.0.x)
Selon le type de l'arbre, quelques champs supplémentaires peuvent être présents dans le noeud de l'arbre. Cette section décrit ces champs additionnels. Avant d'accéder à ces champs additionnels, un contrôle de type de l'arbre doit toujours être fait pour vérifier si on ne lit pas des intervalles de mémoires invalides.
AddN
Champ | Description |
---|---|
Use_StrConcat: Boolean; | Actuellement inutilisé (usage pour l'optimisation dans des versions futures) |
String_Typ: TStringType; | Au cas où l'opérateur + est appliqué sur une String, ce champ indique le type de string. |
CallParaN
Champ | Description |
---|---|
Is_Colon_Para : Boolean; | Utilisé par des routines internes qui peuvent utiliser des paramètres de format optionnels (utilisant des :). Défini à TRUE si ce paramètre est précédé par : (i.e. : :1) (voir [[1]] par exemple). |
Exact_Match_Found : Boolean; | Défini à TRUE si le type du paramètre est est exactement Set to TRUE if the parameter type is exactly the same as the one expected by the routine. |
ConvLevel1Found : Boolean; | Défini à TRUE si le type du paramètre nécessite une conversion de type de niveau 1 pour être conforme au paramètre attendu par la routine. |
ConvLevel2Found : Boolean; | Défini à TRUE si le type du paramètre nécessite une conversion de type de niveau 2 pour être conforme au paramètre attendu par la routine. |
HighTree : pTree; |
AssignN
Champ | Description |
---|---|
AssignTyp: TAssignTyp; | Inutilisé actuellement (Mis en place pour être utilisé dans les affectations à la façon C) |
Concat_String: Boolean; | Inutilisé actuellement (utilisé pour des optimisations dans des versions futures) |
LoadN
Champ | Description |
---|---|
SymTableEntry: PSym; | Entrée de table de symbole pour ce symbole |
SymTable: PSymTable; | Table de symbole dans lequel ce symbole est enregistré |
Is_Absolute: Boolean; | Mis à TRUE si cette variable est absolute. |
Is_First: Boolean; | Mis à TRUE si c'est la première occurence du chargement de cette variable (utilisé avec variable varstate pour des optimisations) |
CallN
Champ | Description |
---|---|
SymTableProcEntry: PProcSym; | Entrée de table de symboles pour cette routine |
SymTableProc: PSymTable; | Table de symbole associé à un appel (table de symboles objet ou table de symboles de routine) |
ProcDefinition: pAbstractProcDef; | Définition de type pour cette routine |
MethodPointer: pTree; | ????????? |
No_Check: Boolean; | inutilisé actuellement |
Unit_Specific: Boolean; | Mis à TRUE si cette routine est importée d'une unité de manière spécifique (p.ex.: system.writeln()) |
Return_Value_Used : Boolean | Mis à TRUE si la routine est une fonction et que la vaelur retournée n'est pas utilisée (dans l'analyse de syntaxe étendue - $X+) |
Static_Call: Boolean; | inutilisé |
addrn
Champ | Description |
---|---|
ProcVarLoad: Boolean; | Mis à TRUE si c'est un appel de variable procédurale |
OrdConstN
Champ | Description |
---|---|
Value: LongInt; | La valeur numérique de ce noeud constante |
RealConstN
Champ | Description |
---|---|
Value_Real: Best_Real; | La valeur numérique de ce noeud constante |
Lab_Real: PAsmLabel; | La référence d'étiquette Assembleur pour cette constante |
FixConstN
Champ | Description |
---|---|
Value_Fix: LongInt; | La valeur numérique de ce noeud constante |
FuncRetN
Champ | Description |
---|---|
FuncRetProcInfo: Pointer; (PProcInfo) | Pointeur vers l'information de procédure |
RetType: TType; | Indique le type de retour de la fonction |
Is_First_FuncRet: Boolean; |
SubscriptN
Champ | Description |
---|---|
vs: pVarSym; | Entrée de table de symboles pour cette variable (un champ d'objet/de classe/d'enregistrement) |
RaiseN
Champ | Description |
---|---|
FrameTree: PTree; | Arbre du cadre d'exception (code dans l'instruction Raise) |
VecN
Champ | Description |
---|---|
MemIndex: Boolean; | Mis à TRUE si la directive Mem[Seg:Ofs] est analysée |
MemSeg: Boolean; | Mis à TRUE si la directive Mem[Seg:Ofs] est analysée |
CallUnique: Boolean; |
StringConstN
Champ | Description |
---|---|
Value_Str: PChar; | La valeur constante de la chaîne |
Length: LongInt; | Longueur de la chaîne en octets (ou en caractères ?) |
Lab_Str: PAsmLabel; | La référence de l'étiquette assembleur de cette constante |
StringType: TStringType; | Le type de la chaîne (short, long, ansi, wide) |
TypeConvN
Champ | Description |
---|---|
ConvType: TConvertType; | Indique la conversion de type à réaliser |
Explizit: Boolean; | Mis à TRUE si cela était une conversion explicite (avec un typecast explicite, ou en appelant une des routines de conversion internes) |
TypeN
Champ | Description |
---|---|
TypeNodeType: PDef; | La définition de type pour ce noeud |
TypeNodeSym: PTypeSym; | L'information de type du symbole |
InlineN
Champ | Description |
---|---|
InlineNumber: Byte; | Indique la routine interne appelée (Cf. générateur de code) |
InlineConst: Boolean; | Un ou plusieurs des paramètres pour cet appel de routine inline contient des valeurs constantes |
ProcInlineN
Les noeuds inline sont créés quand une routine est déclarée comme étant inline. La routine est effectivement inline-ée quand les conditions suivantes sont satisfaites:
- C'est un appel à l'intérieur du même module
- Le commutateur approprié du compilateur est activé
- La routine n'est pas une méthode (i.e. c'est une procédure ou une fonction normale)
Sinon, un appel normal est fait, ignorant la directive inline. Dans le cas où la routine est inline-ée, tous les paramètres, valeurs de retour et variables locales de la routine inline sont effectivement alloués dans l'espace de la pile de la routine dans laquelle l'appel inline est fait (dite routine parent plus bas).
Champ | Description |
---|---|
InlineTree: PTree; | L'arbre complet pour cette routine inline |
InlineProcsym: PProcSym; | Entrée de table de symboles pour cette routine |
RetOffset: LongInt; | Décalage du retour dans l'espace de la pile de la routine parent |
Para_Offset: LongInt; | Décalage du paramètre de départ dans l'espace de la pile de la routine parent |
Para_Size: LongInt; | Taille du paramètre dans l'espace de la pile de la routine parent |
SetConstN
Champ | Description |
---|---|
Value_Set: PConstSet; | La valeur numérique de ce noeud constante |
Lab_Set: PAsmLabel; | La référence de l'étiquette assembleur pour cette constante |
LoopN
Champ | Description |
---|---|
AsmN
Champ | Description |
---|---|
p_Asm: PAasmOutput; | L'arbre d'instruction créé par l'analyseur assembelur |
Object_Preserved: Boolean; | Mis à FALSE si le Self_Register a été modifié dans l'instruction asm |
CaseN
Champ | Description |
---|---|
Nodes: PCaseRecord; | Arbre de chaque alternative possible dans une instruction case |
ElseBlock: PTree; | Arbre du bloc d'instructions Else |
LabelN, GotoN
Champ | Description |
---|---|
LabelNr: PAsmLabel; | Etiquette Assembleur associée avec l'instruction |
ExceptionBlock: PTree; | ? |
LabSym: PLabelSym; | Entrée de table de symboles pour cette étiquette |
WithN
Champ | Description |
---|---|
WithSymTables: PWithSymTable; | |
TableCount: LongInt; | |
WithReference: PReference; | |
IsLocal: Boolean; |
OnN
Champ | Description |
---|---|
ExceptSymTable: PSymTable; | |
ExceptType: PObjectDef; |
ArrayConstructorN
Champ | Description |
---|---|
CArgs: Boolean; | |
CArgSwap: Boolean; | |
ForceVaria: Boolean; | |
NoVariaAllowed: Boolean; | |
ConstructorDef: PDef; |
Prochain chapitre: Table des symboles