實驗一 詞法分析實驗
專業:商業軟件工程 姓名:陳冠中 學號:201506110195
一、 實驗目的
詞法分析程序完成的是編譯第一階段的工作。詞法分析工作是把字符流的源程序變為單詞序列,輸出到一個中間文件,這個文件作為語法分析程序的輸入而繼續編譯過程。而該實驗就是設計一個簡單的詞法分析程序,通過編制一個程序來完成轉換。
二、 實驗內容和要求
實驗要求:
1.輸入:源程序字符串
2.輸出:二元組(種別,單詞符號本身)
實驗內容:
對字符串表示的源程序
從左到右進行掃描和分解
根據詞法規則,識別出一個個具有獨立意義的單詞符號以供語法分析之用
發現詞法錯誤,則返回出錯信息
三、 實驗方法、步驟及結果測試
1.詞法分析程序.c
詞法分析程序.exe
2.原理分析及流程圖
從錄入程序字符串,調用scaner函數 ,讀取字符串中的數據,通過判斷空格或回車前的單元,進行詞法分析,最后以二元組形式輸出。
3.主要程序段及其解釋:
void scaner()
{
sum=0;
for(m=0;m<8;m++)
t[m++]=NULL;
ch=c[p++];
m=0;
while((ch==' ')||(ch=='\n'))
ch=c[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
t[m++]=ch;
ch=c[p++];
}
p--;
s=10;
//這段代碼是在輸入一段源程序后,程序對於里面數字和英文單獨判斷,輸出s。
t[m++]=’\0’;
//這里是程序在輸入后的字符串進行確定,不進行操作會使程序出錯,在輸出過程中進行隨意分配。
for(n=0;n<6;n++)
if(strcmp(t,w[n])==0)
{
s=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0';
ch=c[p++];
}
p--;
s=11;
//在對輸入的源程序判斷時,輸入的不在范圍的程序段時,輸出s
}
else switch(ch)
{
case '<':t[m++]=ch;
ch=c[p++];
if(ch=='>')
{ s=22;
t[m++]=ch;
}
else
{
s=20;
p--;
}
if(ch=='=')
{ s=21;
t[m++]=ch;
}
break;
case '>':t[m++]=ch;
ch=c[p++];
if(ch=='=')
{ s=24;
t[m++]=ch;
}
else
{ s=23;
p--;
}
break;
case '+': s=13;
t[m++]=ch;
break;
case '-':
s=14;
t[m++]=ch;
break;
case '!':ch=c[p++];
if(ch=='=')
{ s=30;
t[m++]=ch;
}
else
{ s=31;
p--;
}
break;
case '=':
s=25;
t[m++]=ch;
break;
case '*': s=15;
t[m++]=ch;
break;
case '/': s=16;
t[m++]=ch;
break;
case '(': s=27;
t[m++]=ch;
break;
case ')': s=28;
t[m++]=ch;
break;
case '{': s=5;
t[m++]=ch;
break;
case '}': s=6;
t[m++]=ch;
break;
case ';': s=26;
t[m++]=ch;
break;
case '\"': s=32;
t[m++]=ch;
break;
case '#': s=0;
t[m++]=ch;
break;
case ':':t[m++]=ch;
ch=c[p++];
if(ch=='=')
{ s=18;
t[m++]=ch;
}
else
{ s=17;
p--;
}
break;
default: s=-1;
break;
}
t[m++]='\0';
}
4.運行結果及分析
四、 實驗總結
在看到詞法分析這個實驗時,對於詞法分析的這個含義還不是很清楚,對於老師布置這個作業的意義也不清楚。在看到書上對於詞法分析的講解時,才明白詞法分析是整個編譯的第一階段工作,可以說好的詞法分析程序會讓之后的編譯工作變得更輕松。在參考了一些詞法分析程序后,對於詞法分析程序中的側重點也有所了解,特別是對於一段源程序的存儲與判斷,最后與種別表進行相應的對比,這是簡單的詞法分析過程。在自己實現這個代碼時,印象最深的是在對於分界符的判斷時,在兩個以上的一起判斷時,就會出現單個分界符的錯誤輸出,在經過一系列的錯誤嘗試后,最后正確輸出。可以說這個詞法分析程序結合許多不同的方法,最終得到的簡單可行的程序。