Lexikalischer Analysator in C++

Muhammad Adil 12 Oktober 2023
  1. Konzept von Tokens in Lexical Analyzer in C++
  2. Der Zweck des lexikalischen Analysators in C++
  3. Schritte zur Verwendung von Lexical Analyzer in C++
Lexikalischer Analysator in C++

Ein lexikalischer Analysator ist ein Computerprogramm, das einen Textstrom in Token zerlegt und deren Typ markiert. Es nimmt die Eingabe als beliebig lange Folge von Zeichen an, die als Eingabezeichenfolge bezeichnet wird, und erzeugt die Ausgabe als eine oder mehrere Folgen von Zeichen, die als Token-Sequenzen bezeichnet werden.

Die Ausgabe können die Token-Sequenzen oder gerade genug Informationen sein, um sie eindeutig zu identifizieren.

Darüber hinaus werden lexikalische Analysatoren typischerweise als zwei getrennte Programme implementiert: eines, das Zeichen aus einem Eingabestrom liest, und ein anderes, das Tokens für jedes Wort ausgibt, auf das es trifft.

Hauptsächlich kann der lexikalische Analysator verwendet werden, um Fehler in einer Textdatei zu identifizieren, wie zum Beispiel Rechtschreibfehler oder Syntaxfehler. Es wird auch verwendet, um bestimmte Muster in der natürlichen Sprache zu erkennen, die als schädlich oder gefährlich angesehen werden könnten, wenn sie im wirklichen Leben auftreten.

Konzept von Tokens in Lexical Analyzer in C++

Token sind die kleinsten und unteilbarsten Bestandteile eines Programms. Es gibt verschiedene Arten von Token, die mit jeder Sprache verknüpft sind.

Bezeichner sind die Namen, die der Benutzer mehreren Teilen des Programms zuweist, z. B. Funktionen und Parametern. Sie werden so genannt, weil sie eine bestimmte Speicheradresse “identifizieren”.

Dann gibt es Schlüsselwörter, eine Sammlung von Wörtern, die von der Sprache verwendet werden, um verschiedene Funktionen auszuführen. In C++ gehören dazu cout, cin, if, else, for, break, continue und so weiter.

Satzzeichen werden verwendet, um Ausdrücke und Aussagen zu erstellen, und sie sind nur hilfreich, wenn sie mit Signifiern oder Schlüsselwörtern in einer Aussage kombiniert werden.

Der Zweck des lexikalischen Analysators in C++

Ein lexikalischer Analysator führt die folgenden Aufgaben aus.

  1. Identifiziert die Token im Eingabetextstrom und gruppiert sie in aussagekräftige Kategorien.
  2. Stellt Informationen zu jedem Token bereit, z. B. seinen Typ und Wert, was beim Verständnis der Bedeutung des Eingabetexts hilft.
  3. Analysiert den Eingabetext, indem er in kleinere Bedeutungseinheiten zerlegt wird, damit sie leichter analysiert werden können.

Schritte zur Verwendung von Lexical Analyzer in C++

Lassen Sie uns die Schritte zur Verwendung eines lexikalischen Analysators in C++ besprechen.

  • Header-Dateien einschließen.
  • Schreiben Sie eine Funktion, um den Satz in Tokens aufzuteilen.
  • Definieren Sie Token und Regeln für jeden Token-Typ.
  • Schreiben Sie Code, um Token aus dem Eingabesatz auszugeben.
  • Testen und debuggen Sie Ihren Code, bis er ordnungsgemäß funktioniert.

Beispiel für den lexikalischen Analysator in 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;
}

Klicken Sie hier, um die Live-Demonstration des Codes wie oben erwähnt zu überprüfen.

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