一、 實驗目的
編制一個詞法分析器,通過該詞法分析程序的設計實例,進一步了解詞法分析程序構造的一些細節。
二、 實驗內容和要求
實驗內容:
對字符串表示的源程序,從左到右進行掃描和分解。根據詞法規則,識別出一個一個具有獨立意義的單詞符號,以供語法分析之用,若發現詞法錯誤,則返回出錯信息。
實驗要求:
輸入:源程序字符串
輸出:二元組(種別,單詞本身)
待分析語言的詞法規則
三、 實驗方法、步驟及結果測試
1. 源程序名:cffx.cpp
可執行程序名: cffx.exe
2. 原理分析及流程圖
存儲結構:數組,string類
主要算法:
void way() { string s; cout << "輸入字符串" << endl; getline(cin, s);//getline函數可以使輸入到string時不會因空格而使后面內容無法錄入到s中,僅接受回車結束輸入 for (int i = 1; i <= 6; i++) { auto found = s.find(key[i]);//find函數找尋s字符串中與key[i]相符合的字符串,若找到則返回該字符串在s中首字母的下標 if (found != string::npos)//npos為string類中的變量,即-1;若found不等於npos則表示找到s中與key[i]相符合的關鍵字 { int lon = key[i].length();//得出字符串長度 for (int j = 0; j < lon; j++, found++) cout << s[found]; cout << "種別碼為" << i << endl; } } }
流程圖:
3. 主要程序段及其解釋:
#include<iostream> #include<string> using namespace std; string key[] = { "", "begin", "if", "then", "while", "do", "end" }; void way();//實現詞法分析器功能 int main() { char a; while (1) { way(); cout << "是否繼續輸入" << endl; cin >> a; getchar(); if (a == 'n' || a == 'N') break; } system("pause"); return 0; } void way() { string s; cout << "輸入字符串" << endl; getline(cin, s);//getline函數可以使輸入到string時不會因空格而使后面內容無法錄入到s中,僅接受回車結束輸入 for (int i = 1; i <= 6; i++) { auto found = s.find(key[i]);//find函數找尋s字符串中與key[i]相符合的字符串,若找到則返回該字符串在s中首字母的下標 if (found != string::npos)//npos為string類中的變量,即-1;若found不等於npos則表示找到s中與key[i]相符合的關鍵字 { int lon = key[i].length();//得出字符串長度 for (int j = 0; j < lon; j++, found++) cout << s[found]; cout << "種別碼為" << i << endl; } } }
4. 運行結果及分析
四、 實驗總結
實驗難點在於如何在輸入的字符串中找到關鍵字,本程序用了string類的find方法,先判斷是否存在關鍵字,若存在則返回關鍵字在字符串出現的位置的首字符下標,再根據length得出關鍵字長度,利用for循環輸出關鍵字,並根據關鍵字所在的關鍵字數組的下標,輸出種別碼。本次實驗使我進一步了解詞法分析程序構造的一些細節。