C++ 中的詞法分析器

Muhammad Adil 2023年10月12日
  1. C++ 中詞法分析器中標記的概念
  2. C++ 中詞法分析器的用途
  3. 在 C++ 中使用詞法分析器的步驟
C++ 中的詞法分析器

詞法分析器是一種計算機程式,可將文字流分解為標記並標記它們的型別。它將輸入作為一個任意長的字元序列,稱為輸入字串,並將輸出作為一個或多個字元序列,稱為標記序列。

輸出可能是令牌序列或僅足以唯一識別它們的資訊。

此外,詞法分析器通常實現為兩個獨立的程式:一個從輸入流中讀取字元,另一個為遇到的每個單詞輸出標記。

詞法分析器主要用於識別文字檔案中的錯誤,例如拼寫錯誤或語法錯誤。它還用於檢測自然語言中的某些模式,如果它們在現實生活中出現,可能會被認為是有害或危險的。

C++ 中詞法分析器中標記的概念

令牌是程式中最小和最不可分割的元件。每種語言都有各種型別的標記。

識別符號是使用者分配給程式多個部分的名稱,例如特徵和引數。它們之所以這樣稱呼,是因為它們識別了一個特定的記憶體地址。

然後是關鍵字,是語言用來執行各種功能的單詞的集合。在 C++ 中,這些包括 coutcinifelseforbreakcontinue 等等。

標點符號用於建立表示式和語句,它們僅在與語句中的能指或關鍵字結合時才有用。

C++ 中詞法分析器的用途

詞法分析器執行以下任務。

  1. 識別輸入文字流中的標記並將它們分組到有意義的類別中。
  2. 提供有關每個標記的資訊,例如其型別和值,這有助於理解輸入文字的含義。
  3. 通過將輸入文字分解為更小的含義單元來解析輸入文字,以便更容易地對其進行分析。

在 C++ 中使用詞法分析器的步驟

讓我們討論在 C++ 中使用詞法分析器的步驟。

  • 包括標頭檔案。
  • 編寫一個函式將句子拆分為標記。
  • 定義標記和每個標記型別的規則。
  • 編寫程式碼以從輸入句子中輸出標記。
  • 測試和除錯你的程式碼,直到它正常工作。

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;
}

點選這裡檢視上述程式碼的演示。

作者: Muhammad Adil
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