│
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) |
Pointer to procedure information
|
RetType: TType; |
Indicates the return type of the function
|
Is_First_FuncRet: Boolean; |
|
SubscriptN
Champ
|
Description
|
vs: pVarSym; |
Symbol table entry for this variable (a field of object/class/record)
|
RaiseN
Champ
|
Description
|
FrameTree: PTree; |
Exception frame tree (code in Raise statement)
|
VecN
Champ
|
Description
|
MemIndex: Boolean; |
Set to TRUE if Mem[Seg:Ofs] directive is parsed
|
MemSeg: Boolean; |
Set to TRUE if Mem[Seg:Ofs] directive is parsed
|
CallUnique: Boolean; |
|
StringConstN
Champ
|
Description
|
Value_Str: PChar; |
The constant value of the string
|
Length: LongInt; |
Length of the string in bytes (or in characters???)
|
Lab_Str: PAsmLabel; |
The assembler label reference to this constant
|
StringType: TStringType; |
The string type (short, long, ansi, wide)
|
TypeConvN
Champ
|
Description
|
ConvType: TConvertType; |
Indicates the conversion type to do
|
Explizit: Boolean; |
set to TRUE if this was an explicit conversion (with explicit typecast, or calling one of the internal conversion routines)
|
TypeN
Champ
|
Description
|
TypeNodeType: PDef; |
The type definition for this node
|
TypeNodeSym: PTypeSym; |
The type symbol information
|
InlineN
Champ
|
Description
|
InlineNumber: Byte; |
Indicates the internal routine called (Cf. code generator)
|
InlineConst: Boolean; |
One or more of the parameters to this inline routine call contains constant values
|
ProcInlineN
Inline nodes are created when a routine is declared as being inline. The routine is actually inlined when the following conditions are satisfied:
It is called within the same module
The appropriate compiler switch to support inline is activated
It is a non-method routine (a standard procedure or function)
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.
Champ
|
Description
|
InlineTree: PTree; |
The complete tree for this inline procedure
|
InlineProcsym: PProcSym; |
Symbol table entry for this procedure
|
RetOffset: LongInt; |
Return offset in parent routine stack space
|
Para_Offset: LongInt; |
Parameter start offset in parent routine stack space
|
Para_Size: LongInt; |
Parameter size in the parent routine stack space
|
SetConstN
Champ
|
Description
|
Value_Set: PConstSet; |
The numeric value of this constant node
|
Lab_Set: PAsmLabel; |
The assembler label reference to this constant
|
LoopN
AsmN
Champ
|
Description
|
p_Asm: PAasmOutput; |
The instruction tree created by the assembler parser
|
Object_Preserved: Boolean; |
set to FALSE if the Self_Register was modified in the asm statement.
|
CaseN
Champ
|
Description
|
Nodes: PCaseRecord; |
Tree for each of the possible case in the case statement
|
ElseBlock: PTree; |
Else statement block tree
|
LabelN, GotoN
Champ
|
Description
|
LabelNr: PAsmLabel; |
Assembler label associated with this statement
|
ExceptionBlock: PTree; |
?
|
LabSym: PLabelSym; |
Symbol table entry for this label
|
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