資源簡介
用C語言編寫一個PL/0詞法分析器,為語法語義分析提供單詞,使之能把輸入的字符串形式的源程序分割成一個個單詞符號傳遞給語法語義分析,并把分析結果(基本字,運算符,標識符,常數以及界符)輸出。
代碼片段和文件信息
/////***************************詞法分析程序***********************************///
#include??????????????????
#include?????????????????
#include??????????????????
#include??
////*******************************************************************************////
char?*rwtab[35]={“main““printf““scanf““else““if““auto““double““int““struct“
??????????????“break““long““switch““case““enum““register““typedef““char“
??“extern““return““union““const““float““short““unsigned““continue“
??“for““signed““void““default““goto““sizeof““volatile““do““while““static“};/*關鍵字定義*/
char?prog[300]={‘\0‘};/*緩沖區*/
char?ch;
int???p;????????/*p是緩沖區prog的指針*/
////****************************關鍵字匹配函數************************************////
int?checkup(char?*Token){???????
??????int?i;
??????for(i=0;i<35;i++)
???????????if(strcmp(Tokenrwtab[i])==0)
???????????????return?1;
??????return?0;
}
////****************************輸出函數****************************************////
void?output(int?kchar?*Token)?????
{
switch(k)
{
case?0:printf(“判斷符:%s\t“Token);break;
case?1:printf(“運算符:%s\t“Token);break;
case?2:printf(“分隔符:%s\t“Token);break;
case?3:printf(“占位符:%s\t“Token);break;
case?4:printf(“不識別:%s\t“Token);break;
case?5:printf(“不合法:%s\t“Token);break;
case?6:printf(“標識符:%s\t“Token);break;
case?7:printf(“關鍵字:%s\t“Token);break;
case?8:printf(“常數:%s\t\t“Token);break;
case?9:printf(“kong\t“);break;
}
}
////*****************************掃描函數****************************************////
void?scaner() ????????????????
{
???int?m=0; ????????/*m是token的指針*/
???char??token[12]={‘\0‘};??????/*存放構成單詞符號的字符串*/
???int?flag=1;?????????????/*標記是否為合法標志符*/
???ch=prog[p++];
???while(ch==‘?‘||ch==‘\n‘)????/*屏蔽掉空格和換行*/
????????ch=prog[p++];
????
?????if(isalpha(ch))???????????/*字符串首部為字母字符時*/
?{
?while(isalnum(ch))????/*判斷字符串第二個為字母或數字*/
{
???????????token[m++]=ch;
???????????ch=prog[p++];
}
?p--;
if(checkup(token)==1) output(7token);/*關鍵字輸出*/
else??output(6token);??????????????????/*標識符輸出*/
?}
????else
?????????if(isdigit(ch))????/*ch是數字字符*/
?{
????????????while(isdigit(ch))????/*ch是數字字符*/
{
token[m++]=ch;
????????????????ch=prog[p++];
}
while(isalpha(ch))?/*若字符串是以數字開頭的標識符則不合法*/
{
token[m++]=ch;
ch=prog[p++];
flag=0;
}
p--;
if(flag==0) output(5token);/*不合法標識符輸出*/
else??output(8token);??????????/*常數輸出*/
?}
????????else?
????????????switch(ch){
??
- 上一篇:sift-surf-orb通用程序
- 下一篇:計算機圖形學基礎—消隱
評論
共有 條評論