Analyseur lexical en C++

Muhammad Adil 12 octobre 2023
  1. Concept de jetons dans l’analyseur lexical en C++
  2. Le but de l’analyseur lexical en C++
  3. Étapes pour utiliser l’analyseur lexical en C++
Analyseur lexical en C++

Un analyseur lexical est un programme informatique qui décompose un flux de texte en jetons et marque leur type. Il prend en entrée une séquence de caractères arbitrairement longue, appelée chaîne d’entrée, et produit une sortie sous la forme d’une ou plusieurs séquences de caractères appelées séquences de jetons.

La sortie peut être les séquences de jetons ou juste assez d’informations pour les identifier de manière unique.

De plus, les analyseurs lexicaux sont généralement implémentés sous la forme de deux programmes distincts : l’un qui lit les caractères d’un flux d’entrée et l’autre qui génère des jetons pour chaque mot qu’il rencontre.

Principalement, l’analyseur lexical peut être utilisé pour identifier les erreurs dans un fichier texte, telles que les fautes d’orthographe ou les erreurs de syntaxe. Il est également utilisé pour détecter certains modèles en langage naturel qui pourraient être considérés comme nuisibles ou dangereux s’ils se produisent dans la vie réelle.

Concept de jetons dans l’analyseur lexical en C++

Les jetons sont les composants les plus petits et les plus indivisibles d’un programme. Il existe différents types de jetons liés à chaque langue.

Les identificateurs sont les noms que l’utilisateur attribue à plusieurs parties du programme, telles que les fonctionnalités et les paramètres. Ils sont appelés ainsi car ils “identifient” une adresse mémoire spécifique.

Ensuite, il y a les mots-clés, une collection de mots utilisés par la langue pour remplir diverses fonctions. En C++, ceux-ci incluent cout, cin, if, else, for, break, continue, etc.

Les ponctuateurs sont utilisés pour créer des expressions et des déclarations, et ils ne sont utiles que lorsqu’ils sont combinés avec des signifiants ou des mots-clés dans une déclaration.

Le but de l’analyseur lexical en C++

Un analyseur lexical effectue les tâches suivantes.

  1. Identifie les jetons dans le flux de texte d’entrée et les regroupe en catégories significatives.
  2. Fournit des informations sur chaque jeton, telles que son type et sa valeur, ce qui aide à comprendre la signification du texte saisi.
  3. Analyse le texte d’entrée en le divisant en plus petites unités de sens afin qu’elles puissent être plus facilement analysées.

Étapes pour utiliser l’analyseur lexical en C++

Discutons des étapes à suivre pour utiliser un analyseur lexical en C++.

  • Inclure les fichiers d’en-tête.
  • Écrivez une fonction pour diviser la phrase en jetons.
  • Définissez des jetons et des règles pour chaque type de jeton.
  • Écrivez du code pour générer des jetons à partir de la phrase d’entrée.
  • Testez et déboguez votre code jusqu’à ce qu’il fonctionne correctement.

Exemple d’analyseur lexical en C++ :

#include <bits/stdc++.h>

#include <string>
using namespace std;

vector<string> demo = {
    "auto",   "break",   "case",  "char",     "const",  "continue", "default",
    "do",     "double",  "else",  "enum",     "extern", "float",    "for",
    "goto",   "if",      "int",   "signed",   "sizeof", "static",   "struct",
    "switch", "typedef", "union", "unsigned", "void",   "volatile", "while"};

vector<string> hello = {"-", "*", "=", "+", "/"};

vector<string> ten = {"67", "87", "5", "12", "90"};

vector<string> parenthesis = {"(", ")"};

vector<string> brackets = {"[", "]"};

void printout(string q) {
  if (find(demo.begin(), demo.end(), q) != demo.end())
    cout << q << " \t keyword\n";
  else if (find(hello.begin(), hello.end(), q) != hello.end())
    cout << q << " \t operator\n";
  else if (find(ten.begin(), ten.end(), q) != ten.end())
    cout << q << " \t number\n";
  else if (find(parenthesis.begin(), parenthesis.end(), q) != parenthesis.end())
    cout << q << " \t paranthesis\n";
  else if (find(brackets.begin(), brackets.end(), q) != brackets.end())

    cout << q << " \t seperator\n";
}

int main() {
  string line;
  vector<string> sample;

  while (getline(cin, line, ' ')) {
    sample.push_back(line);
  }
  for (auto q : sample) printout(q);

  return 0;
}

Cliquez ici pour vérifier la démonstration en direct du code comme mentionné ci-dessus.

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook