Analyse lexicale (analyseur) dans la conception du compilateur avec exemple

โšก Rรฉsumรฉ intelligent

L'analyse lexicale est la premiรจre phase de la conception d'un compilateur ; elle consiste ร  convertir un flux de caractรจres source en jetons significatifs. Elle supprime les espaces et les commentaires, enregistre les jetons dans la table des symboles et signale les erreurs lexicales ร  l'analyseur syntaxique.

  • ๐Ÿ”ค Premiรจre phase de compilation : L'analyse lexicale lit les caractรจres sources et les convertit en une sรฉquence de jetons.
  • ๐Ÿงฉ Mots clรฉs: Un lexรจme est une sรฉquence de caractรจres correspondante, un jeton est sa catรฉgorie et un modรจle dรฉfinit la rรจgle.
  • ???? Comment รงa fonctionne L'analyseur syntaxique demande ยซ obtenir le jeton suivant ยป, et le scanner renvoie les jetons sur demande.
  • ๐Ÿงน Rรดle de nettoyage : L'analyseur lexical supprime les espaces et les commentaires, dรฉveloppe les macros et remplit la table des symboles.
  • โš ๏ธ Erreurs lexicales : Les caractรจres illรฉgaux ou les identifiants mal orthographiรฉs dรฉclenchent des erreurs, gรฉrรฉes par des techniques de rรฉcupรฉration telles que la suppression ou la transposition.
  • ๐Ÿ”€ Analyseur lexical vs analyseur syntaxique : L'analyseur lexical identifie les jetons ; l'analyseur syntaxique construit un arbre d'analyse syntaxique lors de l'analyse syntaxique.

Analyse lexicale

Quโ€™est-ce que lโ€™analyse lexicale ?

Analyse lexicale est la toute premiรจre phase de la conception du compilateur. Un Lexer rรฉcupรจre le code source modifiรฉ qui est รฉcrit sous forme de phrases. En dโ€™autres termes, il vous aide ร  convertir une sรฉquence de caractรจres en une sรฉquence de jetons. L'analyseur lexical dรฉcompose cette syntaxe en une sรฉrie de jetons. Il supprime tout espace supplรฉmentaire ou commentaire รฉcrit dans le code source.

Les programmes qui effectuent une analyse lexicale dans la conception du compilateur sont appelรฉs analyseurs lexicaux ou lexers. Un lexer contient un tokenizer ou un scanner. Si l'analyseur lexical dรฉtecte que le jeton n'est pas valide, il gรฉnรจre une erreur. Le rรดle de Lexical Analyzer dans la conception du compilateur est de lire les flux de caractรจres du code source, de vรฉrifier les jetons lรฉgaux et de transmettre les donnรฉes ร  l'analyseur de syntaxe lorsqu'il le demande.

Exemple

How Pleasant Is The Weather?

Voir cet exemple d'analyse lexicale ; Ici, nous pouvons facilement reconnaรฎtre qu'il y a cinq mots "Quelle est la qualitรฉ du temps". C'est trรจs naturel pour nous car nous pouvons reconnaรฎtre les sรฉparateurs, les espaces et le symbole de ponctuation.

 HowPl easantIs Th ewe ather?

Maintenant, vรฉrifiez cet exemple, nous pouvons รฉgalement lire ceci. Cependant, cela prendra un certain temps car des sรฉparateurs sont placรฉs aux endroits impairs. Ce nโ€™est pas quelque chose qui vous vient immรฉdiatement.

Terminologies de base

Qu'est-ce qu'un lexรจme ?

Un lexรจme est une sรฉquence de caractรจres inclus dans le programme source selon le modรจle de correspondance d'un jeton. Ce n'est rien d'autre qu'une instance d'un jeton.

Qu'est-ce qu'un jeton ?

Dans la conception du compilateur, les jetons sont la sรฉquence de caractรจres qui reprรฉsente une unitรฉ d'information dans le programme source.

Quโ€™est-ce que le modรจle ?

Un modรจle est une description utilisรฉe par le jeton. Dans le cas d'un mot-clรฉ utilisรฉ comme jeton, le modรจle est une sรฉquence de caractรจres.

Analyseur lexical Architecture : Comment les jetons sont reconnus

La tรขche principale de lโ€™analyse lexicale est de lire les caractรจres saisis dans le code et de produire des jetons.

L'analyseur lexical analyse l'intรฉgralitรฉ du code source du programme. Il identifie chaque jeton un par un. Les scanners sont gรฉnรฉralement implรฉmentรฉs pour produire des jetons uniquement ร  la demande d'un analyseur. Voici comment fonctionne la reconnaissance des jetons dans la conception du compilateur :

Analyseur lexical Architecture
Analyseur lexical Architecture
  1. ยซ Get next token ยป est une commande qui est envoyรฉe de l'analyseur ร  l'analyseur lexical.
  2. A la rรฉception de cette commande, l'analyseur lexical analyse l'entrรฉe jusqu'ร  ce qu'il trouve le jeton suivant.
  3. Il renvoie le jeton ร  Parser.

Lexical Analyzer ignore les espaces et les commentaires lors de la crรฉation de ces jetons. Si une erreur est prรฉsente, l'analyseur lexical corrรฉlera cette erreur avec le fichier source et le numรฉro de ligne.

Rรดles de l'analyseur lexical

L'analyseur lexical effectue les tรขches ci-dessous :

  • Aide ร  identifier le jeton dans la table des symboles
  • Supprime les espaces blancs et les commentaires du programme source
  • Corrรจle les messages d'erreur avec le programme source
  • Vous aide ร  dรฉvelopper les macros si elles se trouvent dans le programme source
  • Lire les caractรจres d'entrรฉe du programme source

Exemple d'analyse lexicale, jetons, non-jetons

Considรฉrez le code suivant qui est transmis ร  Lexical Analyzer

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Exemples de jetons crรฉรฉs

lexรจme Token
int Mots-clรฉs
maximales Identifiant
( Opรฉrateur
int Mots-clรฉs
x Identifiant
, Opรฉrateur
int Mots-clรฉs
Y Identifiant
) Opรฉrateur
{ Opรฉrateur
If Mots-clรฉs

Exemples de non-jetons

Type Exemples
Commentaires // Ceci comparera 2 nombres
Directive du prรฉprocesseur #inclut
Directive du prรฉprocesseur #dรฉfinir NUMS 8,9
Macro CHIFFRES
Espace blanc /n /b /t

Erreurs lexicales

Une sรฉquence de caractรจres qui ne peut รชtre analysรฉe dans aucun jeton valide est une erreur lexicale. Faits importants sur l'erreur lexicale :

  • Les erreurs lexicales ne sont pas trรจs courantes, mais elles doivent รชtre gรฉrรฉes par un scanner
  • Les fautes d'orthographe des identifiants, opรฉrateurs, mots-clรฉs sont considรฉrรฉes comme des erreurs lexicales
  • Gรฉnรฉralement, une erreur lexicale est causรฉe par l'apparition d'un caractรจre illรฉgal, principalement au dรฉbut d'un jeton.

Rรฉcupรฉration d'erreur dans l'analyseur lexical

Voici quelques techniques de rรฉcupรฉration dโ€™erreur les plus courantes :

  • Supprime un caractรจre de l'entrรฉe restante
  • En mode panique, les caractรจres successifs sont toujours ignorรฉs jusqu'ร  ce que l'on atteigne un jeton bien formรฉ
  • En insรฉrant le caractรจre manquant dans l'entrรฉe restante
  • Remplacer un personnage par un autre personnage
  • Transposer deux caractรจres de sรฉrie

Analyseur lexical vs analyseur

Analyseur lexical Analyseur
Programme d'entrรฉe de numรฉrisation Effectuer une analyse syntaxique
Identifier les jetons Crรฉer un abdostracreprรฉsentation du code
Insรฉrer des jetons dans la table des symboles Mettre ร  jour les entrรฉes de la table des symboles
Il gรฉnรจre des erreurs lexicales Il gรฉnรจre un arbre d'analyse du code source

Pourquoi sรฉparer Lexical et Parser ?

  • La simplicitรฉ de conception : elle facilite le processus d'analyse lexicale et d'analyse syntaxique en รฉliminant les jetons indรฉsirables.
  • Pour amรฉliorer l'efficacitรฉ du compilateur : vous aide ร  amรฉliorer l'efficacitรฉ du compilateur
  • Spรฉcialisation : des techniques spรฉcialisรฉes peuvent รชtre appliquรฉes pour amรฉliorer le processus d'analyse lexicale
  • Portabilitรฉ : seul le scanner nรฉcessite de communiquer avec le monde extรฉrieur
  • Portabilitรฉ accrue : particularitรฉs spรฉcifiques au pรฉriphรฉrique d'entrรฉe limitรฉes au lexer

Avantages de l'analyse lexicale

  • La mรฉthode de l'analyseur lexical est utilisรฉe par des programmes tels que les compilateurs qui peuvent utiliser les donnรฉes analysรฉes du code d'un programmeur pour crรฉer un code exรฉcutable binaire compilรฉ.
  • Il est utilisรฉ par les navigateurs Web pour formater et afficher une page Web ร  l'aide des donnรฉes analysรฉes de Javascรฉnario, HTML, CSS
  • Un analyseur lexical distinct vous aide ร  construire un processeur spรฉcialisรฉ et potentiellement plus efficace pour la tรขche

Inconvรฉnient de l'analyse lexicale

  • Vous devez passer beaucoup de temps ร  lire le programme source et ร  le partitionner sous forme de jetons
  • Certaines expressions rรฉguliรจres sont assez difficiles ร  comprendre par rapport aux rรจgles PEG ou EBNF
  • Plus d'efforts sont nรฉcessaires pour dรฉvelopper et dรฉboguer le lexer et ses descriptions de jetons
  • Une surcharge d'exรฉcution supplรฉmentaire est requise pour gรฉnรฉrer les tables lexer et construire les jetons

FAQ

Parmi les outils populaires, citons Lex et sa version open source Flex. Vous dรฉfinissez les modรจles de jetons sous forme d'expressions rรฉguliรจres, et l'outil gรฉnรจre automatiquement le code source du scanner, vous รฉvitant ainsi de coder le tokenizer manuellement.

Un analyseur lexical dรฉfinit chaque jeton comme une expression rรฉguliรจre et effectue la correspondance ร  l'aide d'automates finis. Il parcourt les caractรจres de gauche ร  droite et renvoie le jeton suivant correspondant ร  la correspondance valide la plus longue.

Une table de symboles est une structure de donnรฉes dans laquelle l'analyseur lexical stocke les identifiants et leurs attributs, tels que le nom et le type. Later les phases du compilateur lisent et mettent ร  jour le fichier. track variables et fonctions.

L'IA peut gรฉnรฉrer des expressions rรฉguliรจres de jetons ร  partir d'exemples et repรฉrer les ambiguรฏtรฉs ou les chevauchements.ping Il s'agit d'identifier des modรจles et d'expliquer les erreurs d'analyse syntaxique. Cela accรฉlรจre la crรฉation et le dรฉbogage d'un analyseur lexical pour un nouveau langage ou DSL.

Pas exactement. Les compilateurs utilisent des rรจgles fixes et des automates finis pour segmenter le code, tandis que les modรจles d'IA divisent le texte en sous-mots statistiques. Les objectifs diffรจrent : analyse syntaxique exacte contre comprรฉhension flexible du langage.

Rรฉsumez cet article avec :