Conception du compilateur - Analyse lexicale
L'analyse lexicale est la première phase d'un compilateur. Il prend le code source modifié des préprocesseurs de langage qui sont écrits sous forme de phrases. L'analyseur lexical décompose ces syntaxes en une série de jetons, en supprimant tout espace ou commentaire dans le code source.
Si l'analyseur lexical trouve un jeton invalide, il génère une erreur. L'analyseur lexical travaille en étroite collaboration avec l'analyseur de syntaxe. Il lit les flux de caractères à partir du code source, vérifie les jetons légaux et transmet les données à l'analyseur de syntaxe lorsqu'il le demande.
Jetons
On dit que les lexèmes sont une séquence de caractères (alphanumériques) dans un jeton. Il existe des règles prédéfinies pour que chaque lexème soit identifié comme un jeton valide. Ces règles sont définies par des règles de grammaire, au moyen d'un modèle. Un modèle explique ce qui peut être un jeton, et ces modèles sont définis au moyen d'expressions régulières.
Dans le langage de programmation, les mots-clés, les constantes, les identifiants, les chaînes, les nombres, les opérateurs et les symboles de ponctuation peuvent être considérés comme des jetons.
Par exemple, en langage C, la ligne de déclaration de variable
int value = 100;
contient les jetons:
int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).
Spécifications des jetons
Comprenons comment la théorie du langage entreprend les termes suivants:
Alphabets
Tout ensemble fini de symboles {0,1} est un ensemble d'alphabets binaires, {0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F} est un ensemble d'alphabets hexadécimaux, {az, AZ} est un ensemble d'alphabets de langue anglaise.
Cordes
Toute séquence finie d'alphabets est appelée une chaîne. La longueur de la chaîne est le nombre total d'occurrences d'alphabets, par exemple, la longueur de la chaîne tutorialspoint est de 14 et est désignée par | tutorialspoint | = 14. Une chaîne sans alphabets, c'est-à-dire une chaîne de longueur nulle est appelée chaîne vide et est notée ε (epsilon).
Symboles spéciaux
Un langage typique de haut niveau contient les symboles suivants: -
Symboles arithmétiques | Addition (+), Soustraction (-), Modulo (%), Multiplication (*), Division (/) |
Ponctuation | Virgule (,), Point-virgule (;), Point (.), Flèche (->) |
Affectation | = |
Affectation spéciale | + =, / =, * =, - = |
Comparaison | ==,! =, <, <=,>,> = |
Préprocesseur | # |
Spécificateur d'emplacement | & |
Logique | &, &&, |, ||,! |
Opérateur de quart | >>, >>>, <<, <<< |
Langue
Une langue est considérée comme un ensemble fini de chaînes sur un ensemble fini d'alphabets. Les langages informatiques sont considérés comme des ensembles finis et des opérations définies mathématiquement peuvent être effectuées sur eux. Les langages finis peuvent être décrits au moyen d'expressions régulières.
Règle de correspondance la plus longue
Lorsque l'analyseur lexical lit le code source, il scanne le code lettre par lettre; et quand il rencontre un espace blanc, un symbole d'opérateur ou des symboles spéciaux, il décide qu'un mot est terminé.
For example:
int intvalue;
En balayant les deux lexèmes jusqu'à «int», l'analyseur lexical ne peut pas déterminer s'il s'agit d'un mot-clé int ou des initiales de l'identifiant int value.
La règle de correspondance la plus longue stipule que le lexème analysé doit être déterminé en fonction de la correspondance la plus longue parmi tous les jetons disponibles.
L'analyseur lexical suit également rule priorityoù un mot réservé, par exemple un mot-clé, d'une langue a la priorité sur l'entrée de l'utilisateur. Autrement dit, si l'analyseur lexical trouve un lexème qui correspond à n'importe quel mot réservé existant, il devrait générer une erreur.