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 :
(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)
pascal
<tt><b>type</b>
TNode =<b>class</b>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}<b>end;</b></tt>
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.
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
From the Free Pascal wiki, page "The parse tree/fr", as it stood on 2020-12-24 after a change by E-ric, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Version 2, dernière modification par WikiArchive .