《編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼(C語(yǔ)言版).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《編譯原理詞法分析和語(yǔ)法分析報(bào)告代碼(C語(yǔ)言版).doc(5頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
詞法分析
一、 實(shí)驗(yàn)?zāi)康?
設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。
二、 實(shí)驗(yàn)要求
詞法分析程序的功能:
輸入:所給文法的源程序字符串。
輸出:二元組(syn,token或sum)構(gòu)成的序列。
其中:syn為單詞種別碼;
token為存放的單詞自身字符串;
sum為整型常數(shù)。
三、詞法分析程序的C語(yǔ)言程序源代碼:
#include
#include
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
scaner();
main()
{p=0;
printf("\n please input a string(end with #):/n");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!=#);
p=0;
do{
scaner();
switch(syn)
{case 11:printf("( %-10d%5d )\n",sum,syn);
break;
case -1:printf("you have input a wrong string\n");
getch();
exit(0);
default: printf("( %-10s%5d )\n",token,syn);
break;
}
}while(syn!=0);
getch();
}
scaner()
{ sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch== )||(ch==\n))ch=prog[p++];
if(((ch<=z)&&(ch>=a))||((ch<=Z)&&(ch>=A)))
{ while(((ch<=z)&&(ch>=a))||((ch<=Z)&&(ch>=A))||((ch>=0)&&(ch<=9)))
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
break;
}
}
else if((ch>=0)&&(ch<=9))
{ while((ch>=0)&&(ch<=9))
{ sum=sum*10+ch-0;
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case <:token[m++]=ch;
ch=prog[p++];
if(ch===)
{ syn=22;
token[m++]=ch;
}
else
{ syn=20;
p--;
}
break;
case >:token[m++]=ch;
ch=prog[p++];
if(ch===)
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
p--;
}
break;
case +: token[m++]=ch;
ch=prog[p++];
if(ch==+)
{ syn=17;
token[m++]=ch;
}
else
{ syn=13;
p--;
}
break;
case -:token[m++]=ch;
ch=prog[p++];
if(ch==-)
{ syn=29;
token[m++]=ch;
}
else
{ syn=14;
p--;
}
break;
case !:ch=prog[p++];
if(ch===)
{ syn=21;
token[m++]=ch;
}
else
{ syn=31;
p--;
}
break;
case =:token[m++]=ch;
ch=prog[p++];
if(ch===)
{ syn=25;
token[m++]=ch;
}
else
{ syn=18;
p--;
}
break;
case *: syn=15;
token[m++]=ch;
break;
case /: syn=16;
token[m++]=ch;
break;
case (: syn=27;
token[m++]=ch;
break;
case ): syn=28;
token[m++]=ch;
break;
case {: syn=5;
token[m++]=ch;
break;
case }: syn=6;
token[m++]=ch;
break;
case ;: syn=26;
token[m++]=ch;
break;
case \": syn=30;
token[m++]=ch;
break;
case #: syn=0;
token[m++]=ch;
break;
case ::syn=17;
token[m++]=ch;
break;
default: syn=-1;
break;
}
token[m++]=\0;
}
五、結(jié)果分析:
輸入begin x:=9: if x>9 then x:=2*x+1/3; end # 后經(jīng)詞法分析輸出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)…… 如圖5-1所示:
圖5-1
六、總結(jié):
詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。通過(guò)本試驗(yàn)的完成,更加加深了對(duì)詞法分析原理的理解。
鏈接地址:http://www.820124.com/p-9611143.html