│
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
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