C++ 中的詞法分析器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C++ 中的詞法分析器示例:

#include <string>
#include <bits/stdc++.h>
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 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