Difference between revisions of "The parse tree/fr"

From Lazarus wiki
(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...")
 
(LabelN, GotoN)
 
(29 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{The_parse_tree}}
 
{{The_parse_tree}}
  
back to contents [[FPC internals]]
+
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)''
  
The tree is the basis of the compiler. When the compiler parses statements and blocks of code, they are converted to a tree representation. This tree representation is actually a doubly linked list. From this tree the code generation can easily be implemented.
+
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.
  
Assuming that you have the following pascal syntax:
+
En supposant que vous avez la syntaxe Pascal suivante :
  
http://www.pjh2.de/fpc/CompilerInternalsFigure03.png
+
<tt>x := x * y + (6 shl x);</tt>
  
<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 :
  
The tree structure will be built in memory, where each circle represents an element (a node) in the tree:
+
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)''
  
The following tree nodes are possible (of type TNodeTyp):
+
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 || No node (returns nil when loading from ppu)
+
| emptynode || Aucun node (retourne nil au chargement depuis le ppu)
 
|-  
 
|-  
| addn || Represents the + operator
+
| addn || Répresente l'opérateur +
 
|-  
 
|-  
| muln || Represents the * operator
+
| muln || Répresente l'opérateur *
 
|-  
 
|-  
| subn || Represents the - operator
+
| subn || Répresente l'opérateur -
 
|-  
 
|-  
| divn || Represents the div operator
+
| divn || Répresente l'opérateur <tt>div</tt>
 
|-  
 
|-  
| symdifn || Represents the >< operator
+
| symdifn || Répresente l'opérateur ><
 
|-  
 
|-  
| modn || Represents the mod operator
+
| modn || Répresente l'opérateur <tt>mod</tt>
 
|-  
 
|-  
| assignn || Represents the := operator (assignment)  
+
| assignn || Répresente l'opérateur := (affectation)  
 
|-  
 
|-  
| loadn || Represents the use of a variabele
+
| loadn || Répresente l'utilisation d'une variable
 
|-  
 
|-  
| rangen || Represents a range (i.e. 0..9)
+
| rangen || Répresente un intervalle (i.e. 0..9)
 
|-  
 
|-  
| ltn || Represents the < operator
+
| ltn || Répresente l'opérateur <
 
|-  
 
|-  
| lten || Represents the <= operator
+
| lten || Répresente l'opérateur <=
 
|-  
 
|-  
| gtn || Represents the > operator
+
| gtn || Répresente l'opérateur >
 
|-  
 
|-  
| gten || Represents the >= operator
+
| gten || Répresente l'opérateur >=
 
|-  
 
|-  
| equaln || Represents the = operator
+
| equaln || Répresente l'opérateur =
 
|-  
 
|-  
| unequaln || Represents the <> operator
+
| unequaln || Répresente l'opérateur <>
 
|-  
 
|-  
| inn || Represents the in operator
+
| inn || Répresente l'opérateur <tt>in</tt>
 
|-  
 
|-  
| orn || Represents the or operator
+
| orn || Répresente l'opérateur <tt>or</tt>
 
|-  
 
|-  
| xorn || Represents the xor operator
+
| xorn || Répresente l'opérateur <tt>xor</tt>
 
|-  
 
|-  
| shrn || Represents the shr operator
+
| shrn || Répresente l'opérateur <tt>shr</tt>
 
|-  
 
|-  
| shln || Represents the shl operator
+
| shln || Répresente l'opérateur <tt>shl</tt>
 
|-  
 
|-  
| slashn || Represents the / operator
+
| slashn || Répresente l'opérateur /
 
|-  
 
|-  
| andn || Represents the and operator
+
| andn || Répresente l'opérateur <tt>and</tt>
 
|-  
 
|-  
| subscriptn || Represents a field in an object or record
+
| subscriptn || Répresente un champ dans un oibjet ou un enregistrement
 
|-  
 
|-  
| derefn || Represents a pointer reference (such as the ^ operator)
+
| derefn || Répresente une déréférence de pointeur (telle qu'avec l'opérateur ^)
 
|-  
 
|-  
| addrn || Represents the @ operator
+
| addrn || Répresente l'opérateur @
 
|-  
 
|-  
| ordconstn || Represents an ordinal constant
+
| ordconstn || Représente une constante ordinale
 
|-  
 
|-  
| typeconvn || Represents a typecast / type conversion
+
| typeconvn || Représente une conversion de type
 
|-  
 
|-  
| calln || Represents a routine call
+
| calln || Représente un appel de routine
 
|-  
 
|-  
| callparan || Represents a parameter passed to a routine
+
| callparan || Représente un paramètre passé à une routine
 
|-  
 
|-  
| realconstn || Represents a floating point constant
+
| realconstn || Représente une constante en virgule flottante
 
|-  
 
|-  
| unaryminusn || Represents a sign change (e.g : -)
+
| unaryminusn || Représente un signe négatif (p.ex. : -)
 
|-  
 
|-  
| asmn || Represents an assembler statement node
+
| asmn || Représente un noeud d'instruction assembleur
 
|-  
 
|-  
| vecn || Represents array indexing
+
| vecn || Représente l'indexation d'un tableau
 
|-  
 
|-  
| pointerconstn || Represents a pointer constant
+
| pointerconstn || Représente une constante de type pointer
 
|-  
 
|-  
| stringconstn || Represents a string constant
+
| stringconstn || Représente une constante de type string
 
|-  
 
|-  
| notn || Represents the not operator
+
| notn || Répresente l'opérateur <tt>not</tt>
 
|-  
 
|-  
| inlinen || Represents one of the internal routines (writeln,ord,etc.)
+
| inlinen || Répresente une des routines internes (writeln,ord,etc.)
 
|-  
 
|-  
| niln || Represents the nil pointer
+
| niln || Représente le pointeur <tt>nil</tt>
 
|-  
 
|-  
| errorn || Represents error in parsing this node (used for error detection and correction)
+
| errorn || Représente une erreur dans l'analyse de ce noeud (utilisé pour la détection d'erreur et la correction)
 
|-  
 
|-  
| typen || Represents a type name (i.e typeof(obj))
+
| typen || Représente un nom de type (i.e typeof(obj))
 
|-  
 
|-  
| setelementn || Represents set elements (i.e : [a..b], [a,b,c]) (nonconstant)
+
| setelementn || Représente des ensembles d'éléments (i.e : [a..b], [a,b,c]) (non constant)
 
|-  
 
|-  
| setconstn || Represents set element constants i.e : [1..9], [1,2,3])
+
| setconstn || Représente un ensemble d'éléments constants i.e : [1..9], [1,2,3])
 
|-  
 
|-  
| blockn || Represents a block of statements
+
| blockn || Représente un bloc d'instructions
 
|-  
 
|-  
| statementn || One statement in a block of nodes
+
| statementn || Représente une instruction dans un bloc de noeuds
 
|-  
 
|-  
| ifn || Represents an if statement
+
| ifn || Représente une instruction <tt>if</tt>
 
|-  
 
|-  
| breakn || Represents a break statement
+
| breakn || Représente une instruction <tt>break</tt>
 
|-  
 
|-  
| continuen || Represents a continue statement
+
| continuen || Représente une instruction <tt>continue</tt>
 
|-  
 
|-  
| whilerepeatn || Represents a while or repeat statement
+
| whilerepeatn || Représente une instruction <tt>while</tt> ou <tt>repeat</tt>
 
|-  
 
|-  
| forn || Represents a for statement
+
| forn || Représente une instruction <tt>for</tt>
 
|-  
 
|-  
| exitn || Represents an exit statement
+
| exitn || Représente une instruction <tt>exit</tt>
 
|-  
 
|-  
| withn || Represents a with statement
+
| withn || Représente une instruction <tt>with</tt>
 
|-  
 
|-  
| casen || Represents a case statement
+
| casen || Représente une instruction <tt>case</tt>
 
|-  
 
|-  
| labeln || Represents a label statement
+
| labeln || Représente une instruction <tt>label</tt>
 
|-  
 
|-  
| goton || Represents a goto statement
+
| goton || Représente une instruction <tt>goto</tt>
 
|-  
 
|-  
| tryexceptn || Represents a try..except statement
+
| tryexceptn || Représente une instruction <tt>try..except</tt>
 
|-  
 
|-  
| raisen || Represents a raise statement
+
| raisen || Représente une instruction <tt>raise</tt>
 
|-  
 
|-  
| tryfinallyn || Represents a try..finally statement
+
| tryfinallyn || Représente une instruction <tt>try..finally</tt>
 
|-  
 
|-  
| onn || Represents an on..do statement (in exception code)
+
| onn || Représente une instruction <tt>on..do</tt> (dans le code de traitement d'une exception)
 
|-  
 
|-  
| isn || Represents the is operator
+
| isn || Répresente l'opérateur <tt>is</tt>
 
|-  
 
|-  
| asn || Represents the as typecast operator
+
| asn || Répresente l'opérateur de conversion de type <tt>as</tt>
 
|-  
 
|-  
| caretn || Represents the ^ operator
+
| caretn || Répresente l'opérateur ^
 
|-  
 
|-  
| starstarn || Represents the ** operator (exponentiation)
+
| starstarn || Répresente l'opérateur ** (exponentiation)
 
|-  
 
|-  
| arrayconstructorn || Represents a construction node for [...] parsing
+
| arrayconstructorn || Répresente un noeud de construction pour l'analyse de for [...]
 
|-  
 
|-  
| arrayconstructorrangen || Range element to allow sets in array construction tree
+
| arrayconstructorrangen || Elément d'intervalle pour permettre aux ensembles dans l'arbre de construction d'un tableau
 
|-  
 
|-  
| tempcreaten || for temps in the result/firstpass
+
| tempcreaten || pour les temporaires dans le result/firstpass
 
|-  
 
|-  
| temprefn || references to temps
+
| temprefn || Références vers temporaires.
 
|-  
 
|-  
| tempdeleten || for temps in the result/firstpass
+
| tempdeleten || Pour les temporaires dans le result/firstpass
 
|-  
 
|-  
| addoptn || added for optimizations where we cannot suppress
+
| addoptn || Ajouté pour les optimisations où nous ne pouvons pas supprimer.
 
|-  
 
|-  
| nothingn || NOP, Do nothing
+
| nothingn || NOP, Ne fait rien
 
|-  
 
|-  
| loadvmtaddrn || Load the address of the VMT of a class/object
+
| loadvmtaddrn || Charge l'adresse de la VMT d'une classe/d'un objet
 
|-  
 
|-  
| guidconstn || A GUID COM Interface constant
+
| guidconstn || Une constante GUID d'interface COM
 
|-  
 
|-  
| rttin || Rtti information so they can be accessed in result/firstpass
+
| rttin || Informations Rtti pour qu'elles soient accessibles dans result/firstpass
 
|-  
 
|-  
| loadparentfpn || Load the framepointer of the parent for nested procedures
+
| 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 of this node
+
     NodeType: TNodeType;            // type de ce noeud
     BlockType: TBlock_Type;        // type of the current code block, general/const/type
+
     BlockType: TBlock_Type;        // type du bloc de code courant, général/const/type
     ExpectLoc: TCGLoc;              // expected location of the result of this node (pass1)
+
     ExpectLoc: TCGLoc;              // emplacement attendu du résultat de ce noeud (pass1)
     Location: TLocation;            // the location of the result of this node (pass2)
+
     Location: TLocation;            // l'emplacement du résultat de ce noeud (pass2)
     Parent: TNode;                  // the parent node of this is node
+
     Parent: TNode;                  // le noeud parent de ce noeud
                                     // this field is set by concattolist   
+
                                     // ce champ est est défini par concattolist   
     Flags: TNodeFlags;              // there are some properties about the node stored
+
     Flags: TNodeFlags;              // il y a quelques propriétés sur la noeud enregistré
 
     PpuIdx: Longint;
 
     PpuIdx: Longint;
     RegistersInt,                  // the number of registers needed to evalute the node
+
     RegistersInt,                  // le nombre de registres nécessaires pour évaluer ce noeud
 
     RegistersFpu,
 
     RegistersFpu,
     RegistersMm: Longint;          // must be 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 || operands can be swaped
+
| nf_swapable || TBinOp || Les opếrandes peuvent être échangées
 
|-
 
|-
| nf_swaped || TBinOp || operands are swaped
+
| nf_swaped || TBinOp || Les opérandes sont échangées
 
|-
 
|-
| nf_error || &nbsp; || Set to TRUE if there was an error parsing this node
+
| nf_error || &nbsp; || Mis à TRUE s'il y a eu une erreur en analysant ce noeud
 
|-
 
|-
| nf_pass1_done || general || &nbsp;
+
| nf_pass1_done || général || &nbsp;
 
|-
 
|-
| nf_write || general || Node is written to
+
| nf_write || général || Le noeud est écrit vers
 
|-
 
|-
| nf_isproperty || general || TRUE if this is a property
+
| nf_isproperty || général || TRUE si c'est une propriété
 
|-
 
|-
 
| nf_typedaddr || TAddrNode || &nbsp;
 
| nf_typedaddr || TAddrNode || &nbsp;
Line 256: Line 255:
 
| nf_explicit || TTypeConvNode || &nbsp;
 
| nf_explicit || TTypeConvNode || &nbsp;
 
|-
 
|-
| nf_internal || TTypeConvNode || no warnings/hints generated
+
| nf_internal || TTypeConvNode || Aucun avertissement/conseil n'a été généré.
 
|-
 
|-
 
| nf_load_procvar || TTypeConvNode || &nbsp;
 
| nf_load_procvar || TTypeConvNode || &nbsp;
Line 266: Line 265:
 
| nf_block_with_exit || TBlockNode || &nbsp;
 
| nf_block_with_exit || TBlockNode || &nbsp;
 
|}
 
|}
 
  
 
=== 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)''
  
Code generation
+
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;" | Switch
+
! style="background:#f0f0f0;text-align:left;" | Commutateur
! style="background:#f0f0f0;text-align:left;" | Param
+
! 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 || Code generator should emit overflow checking code
+
| 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 || Code generator should emit range checking code
+
| cs_check_range || {$R+} || -Cr, -CR || Le générateur de code devrait émettre du code de contrôle des intervalles
 
|-  
 
|-  
| cs_check_object || &nbsp; || -CR || Code generator should emit code to verify object method call validity
+
| cs_check_object || &nbsp; || -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 || Code generator should emit I/O checking code
+
| 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 || Code generator should emit stack checking code
+
| cs_check_stack || {$S+} || -Ct || Le générateur de code devrait émettre du code de cvontrôle de la pile
 
|-  
 
|-  
| cs_checkpointer || &nbsp; || -gc || Code generator should emit pointer checking code
+
| cs_checkpointer || &nbsp; || -gc || Le générateur de code devrait émettre du code de contrôle de pointeur
 
|-  
 
|-  
| cs_omitstackframe || N/A || &nbsp; || Code generator should not emit frame_pointer setup code in entry code (don't used in the compiler)
+
| cs_omitstackframe || N/A || &nbsp; || 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 || Code generator supports using the assert inline routine
+
| 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+} || &nbsp; || Code generator should emit runtime type information
+
| cs_generate_rtti || {$M+} || &nbsp; || Le générateur de code devrait émettre de l'information de type à l'exécution (''runtime type information'')
 
|-  
 
|-  
| cs_full_boolean_eval || {$B+} || &nbsp; || Boolean evalution mode
+
| cs_full_boolean_eval || {$B+} || &nbsp; || Mode d'évaluation des booléens
 
|-  
 
|-  
 
| cs_typed_const_writable || {$J+} || &nbsp; || '''''todo'''''
 
| cs_typed_const_writable || {$J+} || &nbsp; || '''''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;" | Switch
+
! style="background:#f0f0f0;text-align:left;" | Commutateur
! style="background:#f0f0f0;text-align:left;" | Param
+
! 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+} || &nbsp; || Code generator can use MMX commands
+
| cs_mmx || {$MMX+} || &nbsp; || Le générateur de code peut utiliser des commandes MMX
 
|-  
 
|-  
| cs_mmx_saturation || {$SATURATION+} || &nbsp; || Code generator can use saturated operations (MMX)
+
| cs_mmx_saturation || {$SATURATION+} || &nbsp; || 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;" | Switch
+
! style="background:#f0f0f0;text-align:left;" | Commutateur
! style="background:#f0f0f0;text-align:left;" | Param
+
! 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+} || &nbsp; || Parser emits typed pointer using the @ operator
+
| cs_typed_addresses || {$T+} || &nbsp; || L'analyseur émets des pointeurs typés utilisant l'opérateur @
 
|-  
 
|-  
| cs_strict_var_strings || {$V+} || &nbsp; || String types must be identical (same length) to be compatible
+
| cs_strict_var_strings || {$V+} || &nbsp; || Les types String doivent être identiques (même longueur) pour être compatibles
 
|-  
 
|-  
| cs_ansistrings || {$H+} || -Sh || Parser creates an ansistring when an unspecified String type is declared instead of the default ShortString
+
| 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;" | Switch
+
! style="background:#f0f0f0;text-align:left;" | Commutateur
! style="background:#f0f0f0;text-align:left;" | Param
+
! 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:
 
|}
 
|}
  
=== Additional fields ===
+
=== Champs supplémentaires ===
 
(dernière mise à jour pour fpc version 1.0.x)
 
(dernière mise à jour pour fpc version 1.0.x)
  
Depending on the tree type, some additional fields may be present in the tree node. This section describes these additional fields. Before accessing these additional fields, a check on the treetype should always be done to verify if not reading invalid memory ranges.
+
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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| Use_StrConcat: Boolean; || ''Currently unused (use for optimizations in future versions)''
+
| Use_StrConcat: Boolean; || ''Actuellement inutilisé (usage pour l'optimisation dans des versions futures)''
 
|-  
 
|-  
| String_Typ: TStringType; || In the case where the + operator is applied on a string, this field indicates the string type.
+
| 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;" | Field
+
! 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; || Used for internal routines which can use optional format parameters (using colons). Is set to TRUE if this parameter was preceded by a colon (i.e : :1)
+
| 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; || Set to TRUE if the parameter type requires a level 1 type conversion to conform to the parameter 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; || Set to TRUE if the parameter type requires a level 2 type conversion to conform to the parameter expected by the 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; || &nbsp;
 
| HighTree : pTree; || &nbsp;
Line 379: Line 377:
  
 
{| border="1" cellpadding="3" cellspacing="0"
 
{| border="1" cellpadding="3" cellspacing="0"
! style="background:#f0f0f0;text-align:left;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| AssignTyp: TAssignTyp; || Currently unused (Used to be used for C-like assigns)
+
| AssignTyp: TAssignTyp; || Inutilisé actuellement (Mis en place pour être utilisé dans les affectations à la façon C)
 
|-  
 
|-  
| Concat_String: Boolean; || Currently unused (use for optimizations in future versions)
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| SymTableEntry: PSym; || Symbol table entry for this symbol
+
| SymTableEntry: PSym; || Entrée de table de symbole pour ce symbole
 
|-  
 
|-  
| SymTable: PSymTable; || Symbol table in which this symbol is stored
+
| SymTable: PSymTable; || Table de symbole dans lequel ce symbole est enregistré
 
|-  
 
|-  
| Is_Absolute: Boolean; || set to TRUE if this variable is absolute
+
| Is_Absolute: Boolean; || Mis à TRUE si cette variable est [[Absolute/fr|absolute]].
 
|-  
 
|-  
| Is_First: Boolean; || set to TRUE if this is the first occurrence of the load for this variable (used with the varstate variable for optimizations)
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| SymTableProcEntry: PProcSym; || Symbol table entry for this routine
+
| SymTableProcEntry: PProcSym; || Entrée de table de symboles pour cette routine
 
|-  
 
|-  
| SymTableProc: PSymTable; || Symbol table associated with a call (object symbol table or routine symbol table)
+
| SymTableProc: PSymTable; || Table de symbole associé à un appel (table de symboles objet ou table de symboles de routine)
 
|-  
 
|-  
| ProcDefinition: pAbstractProcDef; || Type definition for this routine
+
| ProcDefinition: pAbstractProcDef; || Définition de type pour cette routine
 
|-  
 
|-  
 
| MethodPointer: pTree; || ?????????
 
| MethodPointer: pTree; || ?????????
 
|-  
 
|-  
| No_Check: Boolean; || ''Currently unused''
+
| No_Check: Boolean; || ''inutilisé actuellement''
 
|-  
 
|-  
| Unit_Specific: Boolean; || set to TRUE if the routine is imported in a unit specific way (for example: system.writeln())
+
| 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 || set to TRUE if the routine is a function and that the return value is not used (in extended syntax parsing - $X+)
+
| 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; || ''unused''
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| ProcVarLoad: Boolean; || Set to TRUE if this is a procedural variable call
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| Value: LongInt; || The numeric value of this constant node
+
| 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;" | Field
+
! 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; || The numeric value of this constant node
+
| Value_Real: Best_Real; || La valeur numérique de ce noeud constante
 
|-  
 
|-  
| Lab_Real: PAsmLabel; || The assembler label reference to this constant
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| Value_Fix: LongInt; || The numeric value of this constant node
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| FuncRetProcInfo: Pointer; (PProcInfo) || Pointer to procedure information
+
| FuncRetProcInfo: Pointer; (PProcInfo) || Pointeur vers l'information de procédure
 
|-  
 
|-  
| RetType: TType; || Indicates the return type of the function
+
| RetType: TType; || Indique le type de retour de la fonction
 
|-  
 
|-  
 
| Is_First_FuncRet: Boolean; || &nbsp;
 
| Is_First_FuncRet: Boolean; || &nbsp;
Line 479: Line 477:
  
 
{| border="1" cellpadding="3" cellspacing="0"
 
{| border="1" cellpadding="3" cellspacing="0"
! style="background:#f0f0f0;text-align:left;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| vs: pVarSym; || Symbol table entry for this variable (a field of object/class/record)
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| FrameTree: PTree; || Exception frame tree (code in Raise statement)
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| MemIndex: Boolean; || Set to TRUE if Mem[Seg:Ofs] directive is parsed
+
| MemIndex: Boolean; || Mis à TRUE si la directive Mem[Seg:Ofs] est analysée
 
|-  
 
|-  
| MemSeg: Boolean; || Set to TRUE if Mem[Seg:Ofs] directive is parsed
+
| MemSeg: Boolean; || Mis à TRUE si la directive Mem[Seg:Ofs] est analysée
 
|-  
 
|-  
 
| CallUnique: Boolean; || &nbsp;
 
| CallUnique: Boolean; || &nbsp;
Line 510: Line 508:
  
 
{| border="1" cellpadding="3" cellspacing="0"
 
{| border="1" cellpadding="3" cellspacing="0"
! style="background:#f0f0f0;text-align:left;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| Value_Str: PChar; || The constant value of the string
+
| Value_Str: PChar; || La valeur constante de la chaîne
 
|-  
 
|-  
| Length: LongInt; || Length of the string in bytes (or in characters???)
+
| Length: LongInt; || Longueur de la chaîne en octets (ou en caractères ?)
 
|-  
 
|-  
| Lab_Str: PAsmLabel; || The assembler label reference to this constant
+
| Lab_Str: PAsmLabel; || La référence de l'étiquette assembleur de cette constante
 
|-  
 
|-  
| StringType: TStringType; || The string type (short, long, ansi, wide)
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| ConvType: TConvertType; || Indicates the conversion type to do
+
| ConvType: TConvertType; || Indique la conversion de type à réaliser
 
|-  
 
|-  
| Explizit: Boolean; || set to TRUE if this was an explicit conversion (with explicit typecast, or calling one of the internal conversion routines)
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| TypeNodeType: PDef; || The type definition for this node
+
| TypeNodeType: PDef; || La définition de type pour ce noeud
 
|-  
 
|-  
| TypeNodeSym: PTypeSym; || The type symbol information
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| InlineNumber: Byte; || Indicates the internal routine called (Cf. code generator)
+
| InlineNumber: Byte; || Indique la routine interne appelée (Cf. générateur de code)
 
|-  
 
|-  
| InlineConst: Boolean; || One or more of the parameters to this inline routine call contains constant values
+
| InlineConst: Boolean; || Un ou plusieurs des paramètres pour cet appel de routine inline contient des valeurs constantes
 
|}
 
|}
  
 
==== ProcInlineN ====
 
==== ProcInlineN ====
  
Inline nodes are created when a routine is declared as being inline. The routine is actually inlined when the following conditions are satisfied:
+
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:
  
It is called within the same module
+
* C'est un appel à l'intérieur du même module
  
The appropriate compiler switch to support inline is activated
+
* Le commutateur approprié du compilateur est activé
  
It is a non-method routine (a standard procedure or function)
+
* La routine n'est pas une méthode (i.e. c'est une procédure ou une fonction normale)
  
Otherwise a normal call is made, ignoring the inline directive. In the case where a routine is inlined, all parameters, return values and local variables of the inlined routine are actually allocated in the stack space of the routine which called the inline routine.
+
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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| InlineTree: PTree; || The complete tree for this inline procedure
+
| InlineTree: PTree; || L'arbre complet pour cette routine inline
 
|-  
 
|-  
| InlineProcsym: PProcSym; || Symbol table entry for this procedure
+
| InlineProcsym: PProcSym; || Entrée de table de symboles pour cette routine
 
|-  
 
|-  
| RetOffset: LongInt; || Return offset in parent routine stack space
+
| RetOffset: LongInt; || Décalage du retour dans l'espace de la pile de la routine parent
 
|-  
 
|-  
| Para_Offset: LongInt; || Parameter start offset in parent routine stack space
+
| Para_Offset: LongInt; || Décalage du paramètre de départ dans l'espace de la pile de la routine parent
 
|-  
 
|-  
| Para_Size: LongInt; || Parameter size in the parent routine stack space
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| Value_Set: PConstSet; || The numeric value of this constant node
+
| Value_Set: PConstSet; || La valeur numérique de ce noeud constante
 
|-  
 
|-  
| Lab_Set: PAsmLabel; || The assembler label reference to this constant
+
| 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;" | Field
+
! 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| p_Asm: PAasmOutput; || The instruction tree created by the assembler parser
+
| p_Asm: PAasmOutput; || L'arbre d'instruction créé par l'analyseur assembelur
 
|-  
 
|-  
| Object_Preserved: Boolean; || set to FALSE if the Self_Register was modified in the asm statement.
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| Nodes: PCaseRecord; || Tree for each of the possible case in the case statement
+
| Nodes: PCaseRecord; || Arbre de chaque alternative possible dans une instruction case
 
|-  
 
|-  
| ElseBlock: PTree; || Else statement block tree
+
| 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;" | Field
+
! style="background:#f0f0f0;text-align:left;" | Champ
 
! style="background:#f0f0f0;text-align:left;" | Description
 
! style="background:#f0f0f0;text-align:left;" | Description
 
|-  
 
|-  
| LabelNr: PAsmLabel; || Assembler label associated with this statement
+
| LabelNr: PAsmLabel; || Etiquette Assembleur associée avec l'instruction
 
|-  
 
|-  
 
| ExceptionBlock: PTree; || ?
 
| ExceptionBlock: PTree; || ?
 
|-  
 
|-  
| LabSym: PLabelSym; || Symbol table entry for this label
+
| 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;" | Field
+
! 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;" | Field
+
! 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;" | Field
+
! 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:
  
  
Next chapter: [[Symbol tables]]
+
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