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

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
( Operator
int Mots-clés
x Identifiant
, Operator
int Mots-clés
Y Identifiant
) Operator
{ Operator
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 une représentation abstraite 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 JavaScript, 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

Résumé

  • L'analyse lexicale est la toute première phase de la conception du compilateur
  • Les lexèmes et les jetons sont la séquence de caractères inclus dans le programme source selon le modèle de correspondance d'un jeton.
  • L'analyseur lexical est implémenté pour analyser l'intégralité du code source du programme
  • L'analyseur lexical aide à identifier le jeton dans la table des symboles
  • Une séquence de caractères qui ne peut être analysée dans aucun jeton valide est une erreur lexicale
  • Supprime un caractère de l'entrée restante est utile Méthode de récupération d'erreur
  • L'analyseur lexical analyse le programme d'entrée pendant que l'analyseur effectue une analyse syntaxique
  • Il facilite le processus d'analyse lexicale et d'analyse syntaxique en éliminant les jetons indésirables.
  • L'analyseur lexical est utilisé par les navigateurs Web pour formater et afficher une page Web à l'aide de données analysées à partir de JavsScript, HTML, CSS.
  • Le plus gros inconvénient de l'utilisation de l'analyseur lexical est qu'il nécessite une surcharge d'exécution supplémentaire pour générer les tables lexer et construire les jetons.