Qu'est-ce que l'analyse lexicale?
L'ANALYSE LEXIQUE est la toute première phase de la conception du compilateur. Un Lexer prend 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 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. 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.
Exemple
How Pleasant Is The Weather?
Voir cet exemple; Ici, nous pouvons facilement reconnaître qu'il y a cinq mots How Pleasant, The, Weather, Is. Ceci 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 du temps car les séparateurs sont placés dans les endroits impairs. Ce n'est pas quelque chose qui vous vient immédiatement.
Dans ce tutoriel, vous apprendrez
- Terminologies de base:
- Architecture de l'analyseur lexical: comment les jetons sont reconnus
- Rôles de l'analyseur lexical
- Erreurs lexicales
- Récupération d'erreurs dans l'analyseur lexical
- Analyseur lexical vs analyseur
- Pourquoi séparer lexical et l'analyseur?
- Avantages de l'analyse lexicale
- Inconvénient de l'analyse lexicale
Terminologies de base
Qu'est-ce qu'un lexème?
Un lexème est une séquence de caractères qui sont 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?
Le jeton est une séquence de caractères qui représente une unité d'information dans le programme source.
Qu'est-ce que Pattern?
Un modèle est une description utilisée par le jeton. Dans le cas d'un mot-clé qui utilise comme jeton, le motif est une séquence de caractères.
Architecture de l'analyseur lexical: comment les jetons sont reconnus
La tâche principale de l'analyse lexicale est de lire les caractères d'entrée dans le code et de produire des jetons.
L'analyseur lexical scanne 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 cela fonctionne-
- "Get next token" est une commande qui est envoyée de l'analyseur à l'analyseur lexical.
- A la réception de cette commande, l'analyseur lexical scanne l'entrée jusqu'à ce qu'il trouve le jeton suivant.
- 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 exécute 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 à partir du programme source
Exemple d'analyse lexicale, jetons, non-jetons
Considérez le code suivant qui est fourni à Lexical Analyzer
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Exemples de jetons créés
Lexème | Jeton |
int | Mot-clé |
maximum | Identifiant |
( | Opérateur |
int | Mot-clé |
X | Identifiant |
, | Opérateur |
int | Mot-clé |
Oui | Identifiant |
) | Opérateur |
{ | Opérateur |
Si | Mot-clé |
Exemples de non-jetons
Taper | Exemples |
Commenter | // Ceci comparera 2 nombres |
Directive du préprocesseur | #include |
Directive du préprocesseur | #define NUMS 8,9 |
Macro | NUMS |
Espace blanc | / n / b / t |
Erreurs lexicales
Une séquence de caractères qu'il n'est pas possible de scanner dans un 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, des opérateurs, des 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'erreurs 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 personnages successifs sont toujours ignorés jusqu'à ce que nous atteignions un jeton bien formé
- En insérant le caractère manquant dans l'entrée restante
- Remplacer un caractère par un autre caractère
- 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 l'analyseur?
- La simplicité de conception: il 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
- Meilleure portabilité: 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 des compilateurs qui peuvent utiliser les données analysées à partir 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 de données analysées à partir de JavsScript, HTML, CSS
- Un analyseur lexical séparé 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
- Un lexème est une séquence de caractères qui sont inclus dans le programme source selon le modèle de correspondance d'un jeton
- L'analyseur lexical est implémenté pour scanner 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 qu'il n'est pas possible de scanner dans un 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
- Lexical Analyzer scanne 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.