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 [https://wiki.freepascal.org/Write#Signature](/wiki/Https://wiki.freepascal.org/Write) 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
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.