姓名:孫曉龍
學號:220800320
日期: 2011/5/10
實驗目的:
詞法分析的目的是將輸入的源程式進行劃分,給出基本符號(token)的序列,並掠過註解和空格等分隔符號。基本符號是與輸入的語言定義的詞法所規定的終結符。
設計、編制、除錯乙個詞法分析子程式-識別單詞,加深對詞法分析原理的理解。
功能描述:
該程式要實現的是乙個讀單詞過程,從輸入的源程式中,識別出各個具有獨立意義的單詞,即基本保留字、識別符號、常數、運算子、分隔符五大類。並依次輸出各個單詞的內部編碼及單詞符號自身值。(遇到錯誤時可顯示「error!
」,然後跳過錯誤部分繼續進行)
設計思想:
設計該詞法分析器的過程中雖然沒有實際將所有的狀態轉移表建立出來,但是所用的思想是根據狀態轉移表實現對單詞的識別。首先構造乙個保留字表,然後,每輸入乙個字元就檢測應該進入什麼狀態,並將該字元連線到d串後繼續輸入,如此迴圈,最後根據所在的接受狀態以及保留字表識別單詞。
程式結構描述:
程式通過main()裡申明乙個morphology變數,通過呼叫morphology中的analysis(vector)成員函式,傳入的vector變數,即為被分析程式,通過該函式,將源程式詞法分析的結果存入morphology中的私有成員變數vector中。data變數為自定義的資料格式,其中包含了int level變數用來儲存記號屬性值和string word 變數用來儲存記號名稱。
函式之間的呼叫關係圖:
程式總體執行流程圖:
符號表:
狀態轉換圖:
識別符號及保留字:
number:
關係操作符:
分隔符:
算術運算子:
使用環境:
windows7下的vs2008
程式測試:
input1 :
int a,b;
a=b+2;
input2:
while(a>=0)
do7x=x+6.7e+23;
end;
input3:
begin:
x:=9
if x>0 then x:=x+1;
while a:=0 do
b:=2*x/3,c:=a;
end;
output1:
3,int
3,a5,,
3,b5,;
3,a2,=
3,b2,+
4,25,;
output2:
1,while
5,(3,a
2,>=
4,05,)
1,do
error line 3
2,=3,x
2,+4,6.7e+23
5,;1,end
5,;output3:
1,begin
error line 1
3,x2,:=
4,91,if
3,x2,>
4,01,then
3,x2,:=
3,x2,+
4,15,;
1,while
3,a2,:=
4,01,do
3,b2,:=
4,22,*
3,x2,/
4,35,,
3,c2,:=
3,a5,;
1,end
5,;測試結果與預期結果一致
實驗心得:
這次實驗一開始編寫有點難,有種無從下手的感覺。由於上課的時候有時候不是很認真聽講,更多時候自己在看書研究,所以有些要點沒有聽到,導致做實驗的時候有些困難。有些不懂的地方去請教同學,終於還是完成了實驗。
通過這個實驗,讓我對編譯原理的認識多了一些,了解了如何設計、編制並且除錯詞法分析程式。在編寫程式的過程中有些不懂的地方慢慢研究琢磨,讓我更加清楚了解掌握詞法分析的過程。詞法分析程式,通過一次讀取乙個字元,通過對該字元的分析,得出了有關結果。
熟悉了構造詞法分析器的方法和相關原理。學會了使用c++語言來編寫詞法分析器,通過類的構造,將詞法分析器讀入的程式看成乙個物件,程式實現對該物件的分析,然後,儲存最後該物件得出的結果。
源程式**:
#include
#include
#include
#include
#include
#include ""
using namespace std;
int main()
cout<}
#ifndef _data_h_
#define _data_h_
#include
//儲存資料的格式//int——屬性值,string——記號
class data
;#endif
#ifndef _morphology_h_
#define _morphology_h_
#include
#include
#include ""
using std::ostream;
using std::string;
using std::vector;
//程式主要功能實現的類
//通過傳入乙個引數進行分析,然後,將結果儲存在vector
class morphology;
#endif
#include ""
#include ""
#include
#include
#include
#include
using namespace std;
//分析傳入的string 輸入引數為:被分析程式
void morphology::analysis(vector vs)
; data dtemp;
for (int i = 0;i <
{for(int j = 0; j < vs[i].size();)
{忽略空格
if(vs[i][j
j++;
continue;
else if ((vs[i][j] >= 'a' && vs[i][j] <= 'z') || (vs[i][j] >= 'a' && vs[i][j] <= 'z'))
int k = j;
j++;
while(j < vs[i].size() &&(vs[i][j] >= 'a' && vs[i][j] <= 'z') || (vs[i][j] >= 'a' && vs[i][j] <= 'z') || (vs[i][j] >= '0' && vs[i][j] <= '9'))
j++;
string re = vs[i].substr(k,j - k);
判斷跳出迴圈的原因是否是遇到了不符合要求的字元
if (j < vs[i].size() &&
vs[i][jvs[i][jvs[i][j] =='<' || vs[i][j] =='>' ||
vs[i][jvs[i][jvs[i][jvs[i][j
vs[i][jvs[i][jvs[i][jvs[i][j
vs[i][jvs[i][jvs[i][j
當某一行有錯誤時,data型別中的word為空
j++;
= "";
= i+1;
else{
int is = 0;//用於判斷是否是保留字,是則為,反之為
for (int i = 0; i < 11;i++)
if(a[i].compare(re) == 0)
= re;
= 1;
is = 1;
if (0 == is)
= re;
= 3;
判斷是否是數字
else if (vs[i][j] >= '0' && vs[i][j] <= '9')
int k = j;
j++;
while(j < vs[i].size())
if (vs[i][j-1] >= '0' && vs[i][j-1] <= '9')
if((vs[i][j] >='0'&& vs[i][j]<='9') || vs[i][j] =='.'||vs[i][j]=='e')
詞法分析器
為給定程式語言設計詞法分析器 1 單詞結構 注釋 以 開頭到該行尾部為注釋 關鍵字 共6個 int real if then else while 識別符號 以字母開頭,後跟字母或數字的符號串,最長為64個字元。注意 關鍵字不是識別符號 操作符 共11個 分隔符 共5個 數字 用正規式描述 digi...
實驗一詞法分析器
一實驗目的 1 通過本實驗加深對詞法分析程式的功能及實現方法的理解 2 使用flex實現詞法分析程式。二實驗內容 下面是簡單c語言的詞法 1.關鍵字 else if int return void while 所有的關鍵字都是保留字,並且必須是小寫。2.下面是專用符號 3.其他標記是id 和num ...
詞法分析器實驗報告
一 實驗內容 設計 編制並除錯乙個詞法分析程式,加深對詞法分析原理的理解。1.待分析的簡單詞法 1 關鍵字 所有的關鍵字都是小寫 begin if then while do end 2 運算子和界符 3 其他單詞是識別符號 id 和整型常數 num 通過以下正規式定義 id letter lett...