Difference between revisions of "Scanner/Tokenizer/fr"

From Lazarus wiki
Jump to navigationJump to search
 
(5 intermediate revisions by the same user not shown)
Line 10: Line 10:
 
le flux d'entrée provoquent une erreur.
 
le flux d'entrée provoquent une erreur.
  
Infos sur comment les macros fonctionnent : [[Macro internals/fr|Macro internals]].
+
Infos sur comment les macros fonctionnent : [[Macro internals|Macro internals]].
  
 
== Architecture ==
 
== Architecture ==
Line 21: Line 21:
  
 
=== Flux d'entrée ===
 
=== Flux d'entrée ===
''(last updated for fpc version 1.0.x)''
+
''(dernière mise à jour pour fpc version 1.0.x)''
  
The input data is handled via the standard way of handling all the I/O in the compiler. That is to say, that it is a hook which can be overriden in '''comphook.pas (do_openinputfile)''', in case where another I/O method wants to be used.
+
Les données d'entrée sont manimpulées via la manière générale de traitement des E/S dans le compilateur. C'est à dire qu'il y a un hook qui peut être surchargé dans '''comphook.pas (do_openinputfile)''', au cas où une autre méthode serait voulue.
  
The default hook uses a non-buffered dos stream contained in '''files.pas'''
+
Le hook par défaut utilise un flux DOS non tamponné contenu dans '''files.pas'''.
  
 
=== Préprocesseur ===  
 
=== Préprocesseur ===  
''(last updated for fpc version 1.0.x)''
+
''(dernière mise à jour pour fpc version 1.0.x)''
  
The scanner resolves all preprocessor directives and only gives to the parser the visible parts of the code (such as those which are included in conditional compilation). Compiler switches and directives are also saved in global variables while in the preprocessor, therefore this is part is completely independent of the parser.
+
L'analyseur lexical résoud toutes les directives du préprocesseur et donne uniquement à l'analyseur syntaxique la partie visible du code (telle que celle qui est inclue dans les directives conditionnelles). es commutateurs et les directives du compilateur sont également enregistrés dans des variables globales dans le préprocesseur, par conséquent, cette partie est complètement indépendante de l'analyseur.
  
 
==== Compilation conditionnelle (scandir.inc, scanner.pas) ====  
 
==== Compilation conditionnelle (scandir.inc, scanner.pas) ====  
''(last updated for fpc version 1.0.x)''
+
''(dernière mise à jour pour fpc version 1.0.x)''
  
The conditional compilation is handled via a preprocessor stack, where each directive is pushed on a stack, and popped when it is resolved. The actual implementation of the stack is a linked list of preprocessor directive items.
+
La compilation conditionnelle est manipulée via une pile du préprocesseur, ou chaque directive est placée sur la pile, et dépilée quand elle est résolue. L'implémentation actuelle de la pile est une liste chaînée des éléments de directive du préprocesseur.
  
 
==== Commutateurs du compiler (scandir.inc, switches.pas) ====
 
==== Commutateurs du compiler (scandir.inc, switches.pas) ====
''(last updated for fpc version 1.0.x)''
+
''(dernière mise à jour pour fpc version 1.0.x)''
  
The compiler switches are handled via a lookup table which is linearly searched. Then another lookup table takes care of setting the appropriate bit flags and variables in the switches for this compilation process.
+
Les commutateurs du compilateur sont gérés via une table de recherche (lookup table) qui fait l'objet d'une recherche linéaire. Ensuite, une autre table de recherche s'occupe de définir les indicateurs de bits et les variables appropriés dans les commutateurs pour ce processus de compilation.
  
== Interface du scanner ==
+
== Interface de l'analyseur ==
''(last updated for fpc version 1.0.x)''
+
''(dernière mise à jour pour fpc version 1.0.x)''
  
The parser only receives tokens as its input, where a token is a enumeration which indicates the type of the token, either a reserved word, a special character, an operator, a numeric constant, string, or an identifier.
+
L'analyseur sémantique ne reçoit que des jetons en entrée, où un jeton est une énumération qui indique le type du jeton, soit un mot réservé, un caractère spécial, un opérateur, une constante numérique, une chaîne ou un identificateur.
  
Resolution of the string into a token is done via lookup which searches the string table to find the equivalent token. This search is done using a binary search algorithm through the string table.
+
La résolution d'une chaîne en un jeton est faite à travers une référence qui recherche la chaîne dans une table pour trouver le jeton correspondant grâce à un algorithme de recherche binaire à travers cette table de chaîne.
  
In the case of identifiers, constants (including numeric values), the value is returned in the '''pattern''' string variable , with the appropriate return value of the token (numeric values are also returned as non-converted strings, with any special prefix included). In the case of operators, and reserved words, only the token itself must be assumed to be preserved. The read input
+
Dans le cas des identificateurs et les constantes (y compris les valeurs numériques), la valeur est retournée dans le variable chaîne '''pattern''', avec la valeur de retour appropriée du jeton (les valeurs numériques sont aussi retournées comme des chaînes non converties avec un préfix spécial inclus). Dans le cas des opérateurs et des mots réservés, seul le jeton lui-même doit être considéré comme préservé. La chaîne d'entrée lue est supposée perdue
string is assmued to be lost.
 
  
Therefore the interface with the parser is with the '''readtoken()''' routine and the '''pattern''' variable.
+
Par conséquent, l'interface avec l'analyseur est avec la routine '''readtoken ()''' et la variable '''pattern'''.
  
 
=== Routines ===
 
=== Routines ===
Line 59: Line 58:
  
 
{|
 
{|
| Declaration: || <tt><b>procedure</b> ReadToken;</tt>
+
| Déclaration: || <tt><b>procedure</b> ReadToken;</tt>
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
| Description: || Sets the global variable token to the current token read, and sets the pattern variable appropriately (if required).
+
| Description: || Définit la variable globale de jeton par le dernier jeton lu, et définit la variable '''pattern''' de manière appropriée (si nécessaire)  
 
|}
 
|}
  
 
=== Variables ===
 
=== Variables ===
  
==== Jeton ====
+
==== Token ====
  
 
{|
 
{|
| Declaration: || <tt><b>var</b> Token: TToken;</tt>
+
| Déclaration: || <tt><b>var</b> Token: TToken;</tt>
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
| Description: || Contains the contain token which was last read by a call to [[#ReadToken|ReadToken]]
+
| Description: || Contient le dernier jeton lu lors du dernier appel à la routine [[#ReadToken|ReadToken]]
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
| See also: || [[#ReadToken|ReadToken]]
+
| Voir aussi: || [[#ReadToken|ReadToken]]
 
|}
 
|}
  
==== Patron ====
+
==== Pattern ====
  
 
{|
 
{|
| Declaration: || <tt><b>var</b> Pattern: String;</tt>
+
| Déclaration: || <tt><b>var</b> Pattern: String;</tt>
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
| Description: || Contains the string of the last pattern read by a call to [[#ReadToken|ReadToken]]
+
| Description: || Contient la chaîne du dernier modèle lu après la dernier appel à [[#ReadToken|ReadToken]]
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
| See also: || [[#ReadToken|ReadToken]]
+
| Voir aussi: || [[#ReadToken|ReadToken]]
 
|}
 
|}
  
 
== Interface du parseur d'assembleur ==
 
== Interface du parseur d'assembleur ==
''(last updated for fpc version 1.0.x)''
+
''(dernière mise à jour pour fpc version 1.0.x)''
  
The inline assembler parser is completely separate from the pascal parser, therefore its scanning process is also completely independent. The scanner only takes care of the preprocessor part and comments, all the rest is passed character per character to the assembler parser via the '''[[#AsmGetChar|AsmGetChar()]]''' scanner routine.
+
L'analyseur d'assembleur en-ligne est complètement séparé de l'analyseur Pascal, par conséquent son processus d'analyse est aussi complètement indépendant. Le scanner ne s'occupe que de la partie préprocesseur et des commentaires, tout le reste est passé caractère par caractère à l'analyseur assembleur via la routine de scanner '''[[#AsmGetChar|AsmGetChar()]]'''.
  
 
=== Routines ===
 
=== Routines ===
Line 96: Line 95:
  
 
{|
 
{|
| Declaration: || <tt><b>function</b> AsmGetChar: Char;</tt>
+
| Déclaration: || <tt><b>function</b> AsmGetChar: Char;</tt>
 
|- style="vertical-align:top"
 
|- style="vertical-align:top"
| Description: || Returns the next character in the input stream.
+
| Description: || Retourne le prochain caractère dans le flusx d'entrée.
 
|}
 
|}
  

Latest revision as of 10:18, 15 December 2020

English (en) français (fr)

Retour au contenu FPC internals

Scanner/Tokenizer

Le scanner et tokenizer est utilisé pour construire un flux d'entrée de jetons qui alimentera l'analyseur. C'est lors de cette étape que les prétraitement (preprocessing) est réalisé, que toutes les directives du compilateur qui sont lues modifient l'état interne des variables du compilateur, et que tous les caractères illégaux trouvés dans le flux d'entrée provoquent une erreur.

Infos sur comment les macros fonctionnent : Macro internals.

Architecture

L'architecture générale du scanner est montrée dans la figure suivante: http://www.pjh2.de/fpc/CompilerInternalsFigure02.png

Plusieurs types peuvent être lus depuis le flux d'entrée, une chaîne, traitée par readstring, une valeur numérique, traitée par readnumeric, des commentaires, des directives du préprocesseur et du compilateur.

Flux d'entrée

(dernière mise à jour pour fpc version 1.0.x)

Les données d'entrée sont manimpulées via la manière générale de traitement des E/S dans le compilateur. C'est à dire qu'il y a un hook qui peut être surchargé dans comphook.pas (do_openinputfile), au cas où une autre méthode serait voulue.

Le hook par défaut utilise un flux DOS non tamponné contenu dans files.pas.

Préprocesseur

(dernière mise à jour pour fpc version 1.0.x)

L'analyseur lexical résoud toutes les directives du préprocesseur et donne uniquement à l'analyseur syntaxique la partie visible du code (telle que celle qui est inclue dans les directives conditionnelles). es commutateurs et les directives du compilateur sont également enregistrés dans des variables globales dans le préprocesseur, par conséquent, cette partie est complètement indépendante de l'analyseur.

Compilation conditionnelle (scandir.inc, scanner.pas)

(dernière mise à jour pour fpc version 1.0.x)

La compilation conditionnelle est manipulée via une pile du préprocesseur, ou chaque directive est placée sur la pile, et dépilée quand elle est résolue. L'implémentation actuelle de la pile est une liste chaînée des éléments de directive du préprocesseur.

Commutateurs du compiler (scandir.inc, switches.pas)

(dernière mise à jour pour fpc version 1.0.x)

Les commutateurs du compilateur sont gérés via une table de recherche (lookup table) qui fait l'objet d'une recherche linéaire. Ensuite, une autre table de recherche s'occupe de définir les indicateurs de bits et les variables appropriés dans les commutateurs pour ce processus de compilation.

Interface de l'analyseur

(dernière mise à jour pour fpc version 1.0.x)

L'analyseur sémantique ne reçoit que des jetons en entrée, où un jeton est une énumération qui indique le type du jeton, soit un mot réservé, un caractère spécial, un opérateur, une constante numérique, une chaîne ou un identificateur.

La résolution d'une chaîne en un jeton est faite à travers une référence qui recherche la chaîne dans une table pour trouver le jeton correspondant grâce à un algorithme de recherche binaire à travers cette table de chaîne.

Dans le cas des identificateurs et les constantes (y compris les valeurs numériques), la valeur est retournée dans le variable chaîne pattern, avec la valeur de retour appropriée du jeton (les valeurs numériques sont aussi retournées comme des chaînes non converties avec un préfix spécial inclus). Dans le cas des opérateurs et des mots réservés, seul le jeton lui-même doit être considéré comme préservé. La chaîne d'entrée lue est supposée perdue

Par conséquent, l'interface avec l'analyseur est avec la routine readtoken () et la variable pattern.

Routines

ReadToken

Déclaration: procedure ReadToken;
Description: Définit la variable globale de jeton par le dernier jeton lu, et définit la variable pattern de manière appropriée (si nécessaire)

Variables

Token

Déclaration: var Token: TToken;
Description: Contient le dernier jeton lu lors du dernier appel à la routine ReadToken
Voir aussi: ReadToken

Pattern

Déclaration: var Pattern: String;
Description: Contient la chaîne du dernier modèle lu après la dernier appel à ReadToken
Voir aussi: ReadToken

Interface du parseur d'assembleur

(dernière mise à jour pour fpc version 1.0.x)

L'analyseur d'assembleur en-ligne est complètement séparé de l'analyseur Pascal, par conséquent son processus d'analyse est aussi complètement indépendant. Le scanner ne s'occupe que de la partie préprocesseur et des commentaires, tout le reste est passé caractère par caractère à l'analyseur assembleur via la routine de scanner AsmGetChar().

Routines

AsmGetChar

Déclaration: function AsmGetChar: Char;
Description: Retourne le prochain caractère dans le flusx d'entrée.


Prochain chapitre: L'arbre d'analyse