C++ 中的詞法分析器
詞法分析器是一種計算機程式,可將文字流分解為標記並標記它們的型別。它將輸入作為一個任意長的字元序列,稱為輸入字串,並將輸出作為一個或多個字元序列,稱為標記序列。
輸出可能是令牌序列或僅足以唯一識別它們的資訊。
此外,詞法分析器通常實現為兩個獨立的程式:一個從輸入流中讀取字元,另一個為遇到的每個單詞輸出標記。
詞法分析器主要用於識別文字檔案中的錯誤,例如拼寫錯誤或語法錯誤。它還用於檢測自然語言中的某些模式,如果它們在現實生活中出現,可能會被認為是有害或危險的。
C++ 中詞法分析器中標記的概念
令牌是程式中最小和最不可分割的元件。每種語言都有各種型別的標記。
識別符號是使用者分配給程式多個部分的名稱,例如特徵和引數。它們之所以這樣稱呼,是因為它們識別
了一個特定的記憶體地址。
然後是關鍵字,是語言用來執行各種功能的單詞的集合。在 C++ 中,這些包括 cout
、cin
、if
、else
、for
、break
、continue
等等。
標點符號用於建立表示式和語句,它們僅在與語句中的能指或關鍵字結合時才有用。
C++ 中詞法分析器的用途
詞法分析器執行以下任務。
- 識別輸入文字流中的標記並將它們分組到有意義的類別中。
- 提供有關每個標記的資訊,例如其型別和值,這有助於理解輸入文字的含義。
- 通過將輸入文字分解為更小的含義單元來解析輸入文字,以便更容易地對其進行分析。
在 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 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