Sign in Join
Wiki copytemporary

The parse tree/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Retour au contenu [[FPC internals/fr|FPC internals]]
22
33# L'arbre syntaxique
44
55## Architecture
66
77*(dernière mise à jour pour fpc version 1.0.x)*
88
99L'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.
1010
1111En supposant que vous avez la syntaxe Pascal suivante :
1212
1313`x := x * y + (6 shl x);`
1414
1515L'arbre de structure sera construit en mémoire, où chque cercle représente un élément (un noeud) dans l'arbre :
1616
1717<http://www.pjh2.de/fpc/CompilerInternalsFigure03.png>
1818
1919## Types de noeud
2020
2121*(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)*
2222
2323Les noeuds possible dans l'arbre sont (de type TNodeTyp):
2424
2525| Tree type definition | Description |
2626|----|----|
2727| emptynode | Aucun node (retourne nil au chargement depuis le ppu) |
2828| addn | Répresente l'opérateur + |
2929| muln | Répresente l'opérateur * |
3030| subn | Répresente l'opérateur - |
3131| divn | Répresente l'opérateur `div` |
3232| symdifn | Répresente l'opérateur \>\< |
3333| modn | Répresente l'opérateur `mod` |
3434| assignn | Répresente l'opérateur := (affectation) |
3535| loadn | Répresente l'utilisation d'une variable |
3636| rangen | Répresente un intervalle (i.e. 0..9) |
3737| ltn | Répresente l'opérateur \< |
3838| lten | Répresente l'opérateur \<= |
3939| gtn | Répresente l'opérateur \> |
4040| gten | Répresente l'opérateur \>= |
4141| equaln | Répresente l'opérateur = |
4242| unequaln | Répresente l'opérateur \<\> |
4343| inn | Répresente l'opérateur `in` |
4444| orn | Répresente l'opérateur `or` |
4545| xorn | Répresente l'opérateur `xor` |
4646| shrn | Répresente l'opérateur `shr` |
4747| shln | Répresente l'opérateur `shl` |
4848| slashn | Répresente l'opérateur / |
4949| andn | Répresente l'opérateur `and` |
5050| subscriptn | Répresente un champ dans un oibjet ou un enregistrement |
5151| derefn | Répresente une déréférence de pointeur (telle qu'avec l'opérateur ^) |
5252| addrn | Répresente l'opérateur @ |
5353| ordconstn | Représente une constante ordinale |
5454| typeconvn | Représente une conversion de type |
5555| calln | Représente un appel de routine |
5656| callparan | Représente un paramètre passé à une routine |
5757| realconstn | Représente une constante en virgule flottante |
5858| unaryminusn | Représente un signe négatif (p.ex. : -) |
5959| asmn | Représente un noeud d'instruction assembleur |
6060| vecn | Représente l'indexation d'un tableau |
6161| pointerconstn | Représente une constante de type pointer |
6262| stringconstn | Représente une constante de type string |
6363| notn | Répresente l'opérateur `not` |
6464| inlinen | Répresente une des routines internes (writeln,ord,etc.) |
6565| niln | Représente le pointeur `nil` |
6666| errorn | Représente une erreur dans l'analyse de ce noeud (utilisé pour la détection d'erreur et la correction) |
6767| typen | Représente un nom de type (i.e typeof(obj)) |
6868| setelementn | Représente des ensembles d'éléments (i.e : \[a..b\], \[a,b,c\]) (non constant) |
6969| setconstn | Représente un ensemble d'éléments constants i.e : \[1..9\], \[1,2,3\]) |
7070| blockn | Représente un bloc d'instructions |
7171| statementn | Représente une instruction dans un bloc de noeuds |
7272| ifn | Représente une instruction `if` |
7373| breakn | Représente une instruction `break` |
7474| continuen | Représente une instruction `continue` |
7575| whilerepeatn | Représente une instruction `while` ou `repeat` |
7676| forn | Représente une instruction `for` |
7777| exitn | Représente une instruction `exit` |
7878| withn | Représente une instruction `with` |
7979| casen | Représente une instruction `case` |
8080| labeln | Représente une instruction `label` |
8181| goton | Représente une instruction `goto` |
8282| tryexceptn | Représente une instruction `try..except` |
8383| raisen | Représente une instruction `raise` |
8484| tryfinallyn | Représente une instruction `try..finally` |
8585| onn | Représente une instruction `on..do` (dans le code de traitement d'une exception) |
8686| isn | Répresente l'opérateur `is` |
8787| asn | Répresente l'opérateur de conversion de type `as` |
8888| caretn | Répresente l'opérateur ^ |
8989| starstarn | Répresente l'opérateur ** (exponentiation) |
9090| arrayconstructorn | Répresente un noeud de construction pour l'analyse de for \[...\] |
9191| arrayconstructorrangen | Elément d'intervalle pour permettre aux ensembles dans l'arbre de construction d'un tableau |
9292| tempcreaten | pour les temporaires dans le result/firstpass |
9393| temprefn | Références vers temporaires. |
9494| tempdeleten | Pour les temporaires dans le result/firstpass |
9595| addoptn | Ajouté pour les optimisations où nous ne pouvons pas supprimer. |
9696| nothingn | NOP, Ne fait rien |
9797| loadvmtaddrn | Charge l'adresse de la VMT d'une classe/d'un objet |
9898| guidconstn | Une constante GUID d'interface COM |
9999| rttin | Informations Rtti pour qu'elles soient accessibles dans result/firstpass |
100100| loadparentfpn | Charge le framepointer du parent pour les procédures imbriquées. |
101101
102102## Champs de structure de noeud (node.pas)
103103
104104*(dernière mise à jour pour fpc version fpc version 2.1.1, 2005-06-11)*
105105
106-`type`\
107-` TNode = ``class`\
108-` public`\
109-`   NodeType: TNodeType;            // type de ce noeud`\
110-`   BlockType: TBlock_Type;         // type  du bloc de code courant, général/const/type`\
111-`   ExpectLoc: TCGLoc;              // emplacement attendu du résultat de ce noeud (pass1)`\
112-`   Location: TLocation;            // l'emplacement du résultat de ce noeud (pass2)`\
113-`   Parent: TNode;                  // le noeud parent de ce noeud`\
114-`                                   // ce champ est est défini par concattolist  `\
115-`   Flags: TNodeFlags;              // il y a quelques propriétés sur la noeud enregistré`\
116-`   PpuIdx: Longint;`\
117-`   RegistersInt,                   // le nombre de registres nécessaires pour évaluer ce noeud`\
118-`   RegistersFpu,`\
119-`   RegistersMm: Longint;           // doit être longint !!!! `\
120-`   {$ifdef SUPPORT_MMX}`\
121-`   RegistersMmx: Longint;`\
122-`   {$endif SUPPORT_MMX}`\
123-`   ResultType: TType;`\
124-`   FileInfo: TFilePosInfo;`\
125-`   LocalSwitches: TLocalSwitches;`\
126-`   {$ifdef extdebug}`\
127-`   MaxFirstPassCount,`\
128-`   FirstPassCount: Longint;`\
129-`   {$endif extdebug}`\
130-` ``end;`
106+``` pascal
107+<tt><b>type</b>
108+ TNode = <b>class</b>
109+ public
110+ NodeType: TNodeType; // type de ce noeud
111+ BlockType: TBlock_Type; // type du bloc de code courant, général/const/type
112+ ExpectLoc: TCGLoc; // emplacement attendu du résultat de ce noeud (pass1)
113+ Location: TLocation; // l'emplacement du résultat de ce noeud (pass2)
114+ Parent: TNode; // le noeud parent de ce noeud
115+ // ce champ est est défini par concattolist
116+ Flags: TNodeFlags; // il y a quelques propriétés sur la noeud enregistré
117+ PpuIdx: Longint;
118+ RegistersInt, // le nombre de registres nécessaires pour évaluer ce noeud
119+ RegistersFpu,
120+ RegistersMm: Longint; // doit être longint !!!!
121+ {$ifdef SUPPORT_MMX}
122+ RegistersMmx: Longint;
123+ {$endif SUPPORT_MMX}
124+ ResultType: TType;
125+ FileInfo: TFilePosInfo;
126+ LocalSwitches: TLocalSwitches;
127+ {$ifdef extdebug}
128+ MaxFirstPassCount,
129+ FirstPassCount: Longint;
130+ {$endif extdebug}
131+ <b>end;</b></tt>
132+```
131133
132134### TNodeFlag
133135
134136*(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)*
135137
136138| TNodeType |   | Description |
137139|----|----|----|
138140| nf_swapable | TBinOp | Les opếrandes peuvent être échangées |
139141| nf_swaped | TBinOp | Les opérandes sont échangées |
140142| nf_error |   | Mis à TRUE s'il y a eu une erreur en analysant ce noeud |
141143| nf_pass1_done | général |   |
142144| nf_write | général | Le noeud est écrit vers |
143145| nf_isproperty | général | TRUE si c'est une propriété |
144146| nf_typedaddr | TAddrNode |   |
145147| nf_no_checkpointer | TDerefNode |   |
146148| nf_memindex | TVecNode |   |
147149| nf_memseg | TVecNode |   |
148150| nf_callunique | TVecNode |   |
149151| nf_absolute | TLoadNode |   |
150152| nf_is_self | TLoadNode |   |
151153| nf_load_self_pointer | TLoadNode |   |
152154| nf_is_currency | TAddNode |   |
153155| nf_has_pointerdiv | TAddNode |   |
154156| nf_concat_string | TAssignmentNode |   |
155157| nf_use_strconcat | TAssignmentNode |   |
156158| nf_forcevaria | TArrayConstructNode |   |
157159| nf_novariaallowed | TArrayConstructNode |   |
158160| nf_explicit | TTypeConvNode |   |
159161| nf_internal | TTypeConvNode | Aucun avertissement/conseil n'a été généré. |
160162| nf_load_procvar | TTypeConvNode |   |
161163| nf_inlineconst | TInlineNode |   |
162164| nf_get_asm_position | TAsmNode |   |
163165| nf_block_with_exit | TBlockNode |   |
164166
165167### TLocalSwitches
166168
167169*(dernière mise à jour pour fpc version 2.1.1, 2005-06-11)*
168170
169171Génération de code
170172
171173| TLocalSwitches | Commutateur | Paramètre | Description |
172174|----|----|----|----|
173175| cs_check_overflow | {\$Q+} | -Co | Le générateur de code devrait émettre du code de contrôle de débordement |
174176| cs_check_range | {\$R+} | -Cr, -CR | Le générateur de code devrait émettre du code de contrôle des intervalles |
175177| cs_check_object |   | -CR | Le générateur de code devrait émettre du code pour vérifier la validité des appels de méthode |
176178| cs_check_io | {\$I+} | -Ci | Le générateur de code devrait émettre du code de contrôle des E/S |
177179| cs_check_stack | {\$S+} | -Ct | Le générateur de code devrait émettre du code de cvontrôle de la pile |
178180| cs_checkpointer |   | -gc | Le générateur de code devrait émettre du code de contrôle de pointeur |
179181| 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) |
180182| cs_do_assertion | {\$C+} | -Sa | Le générateur de code supporte l'utilisation de la routine en-ligne assert (*assert inline routine*) |
181183| cs_generate_rtti | {\$M+} |   | Le générateur de code devrait émettre de l'information de type à l'exécution (*runtime type information*) |
182184| cs_full_boolean_eval | {\$B+} |   | Mode d'évaluation des booléens |
183185| cs_typed_const_writable | {\$J+} |   | ***todo*** |
184186| cs_allow_enum_calc |   |   | ***todo*** |
185187
186188MMX
187189
188190| TLocalSwitches | Commutateur | Paramètre | Description |
189191|----|----|----|----|
190192| cs_mmx | {\$MMX+} |   | Le générateur de code peut utiliser des commandes MMX |
191193| cs_mmx_saturation | {\$SATURATION+} |   | Le générateur de code peut utiliser des opérations saturées (MMX) |
192194
193195Parser
194196
195197| TLocalSwitches | Commutateur | Paramètre | Description |
196198|----|----|----|----|
197199| cs_typed_addresses | {\$T+} |   | L'analyseur émets des pointeurs typés utilisant l'opérateur @ |
198200| cs_strict_var_strings | {\$V+} |   | Les types String doivent être identiques (même longueur) pour être compatibles |
199201| 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 |
200202
201203MACPAS specific
202204
203205| TLocalSwitches | Commutateur | Paramètre | Description |
204206|-----------------------|-------------|-----------|-------------|
205207| cs_external_var | {\$J+} |   | ***todo*** |
206208| cs_externally_visible | {\$Z+} |   | ***todo*** |
207209
208210### Champs supplémentaires
209211
210212(dernière mise à jour pour fpc version 1.0.x)
211213
212214Selon 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.
213215
214216#### AddN
215217
216218| Champ | Description |
217219|----|----|
218220| Use_StrConcat: Boolean; | *Actuellement inutilisé (usage pour l'optimisation dans des versions futures)* |
219221| String_Typ: TStringType; | Au cas où l'opérateur + est appliqué sur une String, ce champ indique le type de string. |
220222
221223#### CallParaN
222224
223225| Champ | Description |
224226|----|----|
225227| 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|https://wiki.freepascal.org/Write#Signature]] par exemple). |
226228| 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. |
227229| 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. |
228230| 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. |
229231| HighTree : pTree; |   |
230232
231233#### AssignN
232234
233235| Champ | Description |
234236|----|----|
235237| AssignTyp: TAssignTyp; | Inutilisé actuellement (Mis en place pour être utilisé dans les affectations à la façon C) |
236238| Concat_String: Boolean; | Inutilisé actuellement (utilisé pour des optimisations dans des versions futures) |
237239
238240#### LoadN
239241
240242| Champ | Description |
241243|----|----|
242244| SymTableEntry: PSym; | Entrée de table de symbole pour ce symbole |
243245| SymTable: PSymTable; | Table de symbole dans lequel ce symbole est enregistré |
244246| Is_Absolute: Boolean; | Mis à TRUE si cette variable est [[Absolute/fr|absolute]]. |
245247| Is_First: Boolean; | Mis à TRUE si c'est la première occurence du chargement de cette variable (utilisé avec variable varstate pour des optimisations) |
246248
247249#### CallN
248250
249251| Champ | Description |
250252|----|----|
251253| SymTableProcEntry: PProcSym; | Entrée de table de symboles pour cette routine |
252254| SymTableProc: PSymTable; | Table de symbole associé à un appel (table de symboles objet ou table de symboles de routine) |
253255| ProcDefinition: pAbstractProcDef; | Définition de type pour cette routine |
254256| MethodPointer: pTree; | ????????? |
255257| No_Check: Boolean; | *inutilisé actuellement* |
256258| Unit_Specific: Boolean; | Mis à TRUE si cette routine est importée d'une unité de manière spécifique (p.ex.: system.writeln()) |
257259| 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+) |
258260| Static_Call: Boolean; | *inutilisé* |
259261
260262#### addrn
261263
262264| Champ | Description |
263265|----|----|
264266| ProcVarLoad: Boolean; | Mis à TRUE si c'est un appel de variable procédurale |
265267
266268#### OrdConstN
267269
268270| Champ | Description |
269271|-----------------|-------------------------------------------|
270272| Value: LongInt; | La valeur numérique de ce noeud constante |
271273
272274#### RealConstN
273275
274276| Champ | Description |
275277|----|----|
276278| Value_Real: Best_Real; | La valeur numérique de ce noeud constante |
277279| Lab_Real: PAsmLabel; | La référence d'étiquette Assembleur pour cette constante |
278280
279281#### FixConstN
280282
281283| Champ | Description |
282284|---------------------|-------------------------------------------|
283285| Value_Fix: LongInt; | La valeur numérique de ce noeud constante |
284286
285287#### FuncRetN
286288
287289| Champ | Description |
288290|----|----|
289291| FuncRetProcInfo: Pointer; (PProcInfo) | Pointeur vers l'information de procédure |
290292| RetType: TType; | Indique le type de retour de la fonction |
291293| Is_First_FuncRet: Boolean; |   |
292294
293295#### SubscriptN
294296
295297| Champ | Description |
296298|----|----|
297299| vs: pVarSym; | Entrée de table de symboles pour cette variable (un champ d'objet/de classe/d'enregistrement) |
298300
299301#### RaiseN
300302
301303| Champ | Description |
302304|----|----|
303305| FrameTree: PTree; | Arbre du cadre d'exception (code dans l'instruction Raise) |
304306
305307#### VecN
306308
307309| Champ | Description |
308310|----|----|
309311| MemIndex: Boolean; | Mis à TRUE si la directive Mem\[Seg:Ofs\] est analysée |
310312| MemSeg: Boolean; | Mis à TRUE si la directive Mem\[Seg:Ofs\] est analysée |
311313| CallUnique: Boolean; |   |
312314
313315#### StringConstN
314316
315317| Champ | Description |
316318|----|----|
317319| Value_Str: PChar; | La valeur constante de la chaîne |
318320| Length: LongInt; | Longueur de la chaîne en octets (ou en caractères ?) |
319321| Lab_Str: PAsmLabel; | La référence de l'étiquette assembleur de cette constante |
320322| StringType: TStringType; | Le type de la chaîne (short, long, ansi, wide) |
321323
322324#### TypeConvN
323325
324326| Champ | Description |
325327|----|----|
326328| ConvType: TConvertType; | Indique la conversion de type à réaliser |
327329| Explizit: Boolean; | Mis à TRUE si cela était une conversion explicite (avec un typecast explicite, ou en appelant une des routines de conversion internes) |
328330
329331#### TypeN
330332
331333| Champ | Description |
332334|------------------------|-------------------------------------|
333335| TypeNodeType: PDef; | La définition de type pour ce noeud |
334336| TypeNodeSym: PTypeSym; | L'information de type du symbole |
335337
336338#### InlineN
337339
338340| Champ | Description |
339341|----|----|
340342| InlineNumber: Byte; | Indique la routine interne appelée (Cf. générateur de code) |
341343| InlineConst: Boolean; | Un ou plusieurs des paramètres pour cet appel de routine inline contient des valeurs constantes |
342344
343345#### ProcInlineN
344346
345347Les 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:
346348
347349- C'est un appel à l'intérieur du même module
348350
349351- Le commutateur approprié du compilateur est activé
350352
351353- La routine n'est pas une méthode (i.e. c'est une procédure ou une fonction normale)
352354
353355Sinon, 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).
354356
355357| Champ | Description |
356358|----|----|
357359| InlineTree: PTree; | L'arbre complet pour cette routine inline |
358360| InlineProcsym: PProcSym; | Entrée de table de symboles pour cette routine |
359361| RetOffset: LongInt; | Décalage du retour dans l'espace de la pile de la routine parent |
360362| Para_Offset: LongInt; | Décalage du paramètre de départ dans l'espace de la pile de la routine parent |
361363| Para_Size: LongInt; | Taille du paramètre dans l'espace de la pile de la routine parent |
362364
363365#### SetConstN
364366
365367| Champ | Description |
366368|----|----|
367369| Value_Set: PConstSet; | La valeur numérique de ce noeud constante |
368370| Lab_Set: PAsmLabel; | La référence de l'étiquette assembleur pour cette constante |
369371
370372#### LoopN
371373
372374| Champ | Description |
373375|-------|-------------|
374376|   |   |
375377
376378#### AsmN
377379
378380| Champ | Description |
379381|----|----|
380382| p_Asm: PAasmOutput; | L'arbre d'instruction créé par l'analyseur assembelur |
381383| Object_Preserved: Boolean; | Mis à FALSE si le Self_Register a été modifié dans l'instruction asm |
382384
383385#### CaseN
384386
385387| Champ | Description |
386388|----|----|
387389| Nodes: PCaseRecord; | Arbre de chaque alternative possible dans une instruction case |
388390| ElseBlock: PTree; | Arbre du bloc d'instructions Else |
389391
390392#### LabelN, GotoN
391393
392394| Champ | Description |
393395|------------------------|--------------------------------------------------|
394396| LabelNr: PAsmLabel; | Etiquette Assembleur associée avec l'instruction |
395397| ExceptionBlock: PTree; | ? |
396398| LabSym: PLabelSym; | Entrée de table de symboles pour cette étiquette |
397399
398400#### WithN
399401
400402| Champ | Description |
401403|-------------------------------|-------------|
402404| WithSymTables: PWithSymTable; |   |
403405| TableCount: LongInt; |   |
404406| WithReference: PReference; |   |
405407| IsLocal: Boolean; |   |
406408
407409#### OnN
408410
409411| Champ | Description |
410412|----------------------------|-------------|
411413| ExceptSymTable: PSymTable; |   |
412414| ExceptType: PObjectDef; |   |
413415
414416#### ArrayConstructorN
415417
416418| Champ | Description |
417419|--------------------------|-------------|
418420| CArgs: Boolean; |   |
419421| CArgSwap: Boolean; |   |
420422| ForceVaria: Boolean; |   |
421423| NoVariaAllowed: Boolean; |   |
422424| ConstructorDef: PDef; |   |
423425
424426Prochain chapitre: [[Symbol tables/fr|Table des symboles]]
425427
426428---
427429*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](/wiki-contact).*

Back to history