編譯原理課程即將結束,開始了在校中最麻煩的實驗,編譯實驗......同在乙個系,其他班的編譯實驗分成好幾塊,簡短的文法,
源**連線:
詞法分析流程圖:
首先要做的第一步就是寫資料結構以及完成單詞表。詞法分析的任務就是將一段程式**,分割單詞,把單詞資訊寫出來。
例如在**: while a<2 do a:=a+1; 中進行詞法分析得出來結果,(while,關鍵字) (a,識別符號) (<,算符)(2,整數) (do,關鍵字) (a,識別符號)
(:=,算符) (a,識別符號)(+,算符) (1,整數) (;,界符) 將**中單詞乙個個的取出來進行分析便是詞法分析的任務。輸出內容是符號表檔案和
token檔案。
單詞表如下圖:
單詞
編碼
單詞
編碼
單詞
編碼
單詞
編碼
endorbegin
program
bool
real
dothen
else
true
endvar
false
while
if識別符號
integer
整數not
實數
單詞表可以用一維物件陣列實現,根據編碼或者陣列索引來判斷該單詞是不是關鍵字還是算符或界符。
之後寫一些判斷的函式,判斷是否是關鍵字,是否是數字,是否是算符,是否是界符
然後按照流程來,讀取檔案,乙個字元乙個字元的讀,如果讀到第i=0個字元是字母,則讀第i+1個,一直讀到不是字母或數字為止,
將這i個字元構成乙個單詞,查詢是不是關鍵字,如果不是則為識別符號。如果讀到的第i=0個字元是數字,則繼續讀第i+1個,一直讀到不是
字母或數字為止。判斷這單詞是不是數字(浮點數,整數),如果讀到第i=0字元既不是字母也不是數字,則讀取下乙個字元(記為變數a)和下
兩個字元(記為變數b),判斷這a或b中有沒有算符,判斷a是不是界符,如果都不是則為非法字元。像這樣讀完整個程式結束輸出符號表檔案。
#include#include#include#include using namespace std; struct wordtoken ; struct wordsymble ; struct symble ; #pragma region 單詞表 wordtoken keyword = , , , , , , , , , , , , , , , , }; wordtoken operatorword = , , , , , , , , , , , }; wordtoken delimeter = , , , , , }; #pragma endregion int iskeyword(string s)//關鍵字 i++; } return 18; //識別符號 } } return -1; } int isoperator(string s)//算符 i++; } } return -1; } int isdelimeter(string s)//界符 i++; } } return -1; } int isdight(string &s, int n)//整數 if (((s[i] >= 'a') && (s[i] <= 'z')) || ((s[i] >= 'a') && (s[i] <= 'z'))) i++; } else for (int k = i - 1; k < s.length(); k++) break; } } if (j == 2 || !a) if (j == 0) else if (j >= 1) return -1; } int length = 0; extern int line = 0; string word; string text; int k = 0; //wordsysmble個數 1開始 int l = 0; string alltext[100]; wordsymble wss[1000]; symble fuhaobiao[1000]; void get_token() //生成符號表和token i--; if (iskeyword(word) != -1) else } } else if ((text[i] >= 48) && (text[i] <= 57)) i--; int a = isdight(word, line); if (a == 19) else if (a == 20) } else else if (isdelimeter(word) != -1) else if (isoperator(word) != -1) else } } } } } void readtext(string file) infile.close(); } void printreadtext(string url = "d: / a.txt") cout << endl; cout << "下面進行詞法分析" << endl; cout << endl; get_token(); } void printtokenresult() j = 0; cout << endl; cout << "符號表為" << endl; while (fuhaobiao[j].name != "") cout << endl; }
部分輸出結果如圖所示:
實驗一 詞法分析
1 實驗要求 1 從源程式檔案中讀取有效字元流並將其分析識別單詞符號,轉換成二元組內部表示形式輸出。2 視覺化方式展示詞法分析識別過程或者詞法分析器工作原理 選做 3 實驗時間4學時。4 實驗完成後,要提交實驗報告 包括源程式清單 2 實驗內容 2.1主程式設計考慮 主程式的說明部分為各種 和變數安...
實驗一 詞法分析實驗
實驗一 詞法分析實驗 專業 商軟2班 姓名 李文輝 學號 201506110168 一 實驗目的 編制乙個詞法分析程式 二 實驗內容和要求 實驗內容 1.對字串表示的源程式 2.從左到右進行掃瞄和分解 3.根據詞法規則 4.識別出乙個乙個具有獨立意義的單詞符號 5.以供語法分析之用 6.發現詞法錯誤...
實驗一 詞法分析實驗
實驗 一 詞法分析實驗 商業軟體工程專業 張煌 201506110130 一 實驗目的 從左至右地對源程式進行掃瞄,按照語言的詞法規則識別各類單詞,並產生以為格式的結果。二 實驗內容和要求 輸入 源程式字串 輸出 二元組 種別,單詞符號本身 三 實驗方法 步驟及結果測試 1.源程式名 壓縮包檔案 r...