?? 詞法分析程序.txt
字號:
詞法分析程序
/*************************************************************/
/*
/*詞法分析程序
/*maker:張建波
/*date:2005-10-26
/*
/*************************************************************/
#include "stdio.h"
#include "ctype.h"
#include "string.h"
/*保留字數量*/
#define keywordSum 8
char *keyword[keywordSum]={"if","else","for","while","do","int","read","write"};
/*純但單分界符*/
#define singlewordSum 10
char singleword[singlewordSum]="+-*(){};,:";
/*雙分界符*/
#define doublewordSum 4
char doubleword[doublewordSum]="<>=!";
#define wordlen 40 /*單詞最大長度*/
char ScanInFile[300]; /*待分析的源程序文件*/
char ScanOutFile[305]; /*詞法分析后的輸出文件*/
FILE *fin,*fout; /*輸入輸出文件的指針*/
int LoadCodeFile()
{
/* 打開待分析的 源代碼文件*/
printf("請輸入源程序文件名:");
scanf("%s",ScanInFile);
if((fin=fopen(ScanInFile,"r"))==NULL)
{
printf("\n找不到文件:%s\n文件打開失敗!\n");
return 0;
}
else
return 1;
}
int CreatWordFile()
{
/*創建次詞法分析后結果的輸出 文件*/
int len=0;
int i=0;
strcpy(ScanOutFile,ScanInFile);
while(ScanOutFile[i++]!='.');
ScanOutFile[i+1]='s';
ScanOutFile[i+2]='c';
ScanOutFile[i+3]='n';
ScanOutFile[i+4]='\0';
if((fout=fopen(ScanOutFile,"w"))==NULL)
{
/*文件創建失敗*/
return 0;
}
else
return 1;
}
/*詞法分析程序*/
int TScan()
{
char ch,token[wordlen]; /*ch 為每次讀入的字符,token 為識別出來的單詞*/
char ch1; /*處理注釋時 用的臨時變量*/
int err=0; /* 設置錯誤代碼為 0, 表示沒有錯誤 */
int j,n; /*臨時變量,控制組合單詞時的數組下標*/
if(LoadCodeFile()==0)
return 1; /*源代碼文件讀取失敗*/
if(CreatWordFile()==0)
return 2; /*文件創建失敗*/
ch=getc(fin);
while(ch!=EOF)
{
while(ch==' '||ch=='\n'||ch=='\t')
{
ch=getc(fin);
}
if(isalpha(ch))
{
/*輸入的是字母,進行 標示符 處理*/
token[0]=ch;
j=1;
while(isalnum(ch))
{
token[j++]=ch;
ch=getc(fin);
}/*如果是字母數字則組合,否則結束*/
token[j]='\0';
/*查找保留字*/
n=0;
while((n<keywordSum) && strcmp(token,keyword[n]))
n++;
if(n>=keywordSum)
{
/*輸出標示符*/
fprintf(fout,"%s\t%s\n","ID",token);
printf("%s\t%s\n","ID",token);
}
else
{
/*輸出保留字*/
fprintf(fout,"%s\t%s\n",token,token);
printf("%s\t%s\n",token,token);
}
}
else if(isdigit(ch))
{
/*輸入的是數字,進行 數字處理*/
token[0]=ch;
j=1;
ch=getc(fin);/*讀下一字符*/
while(isdigit(ch))
{/*如果是數字則整合數字*/
token[j++]=ch;
ch=getc(fin);
}
token[j]='\0';/*整數整合結束*/
fprintf(fout,"%s\t%s\n","NUM",token);
printf("%s\t%s\n","NUM",token);
}
else if(strchr(singleword,ch)>0)
{
/*輸入的是單分界符*/
token[0]=ch;
token[1]='\0';
ch=getc(fin);
fprintf(fout,"%s\t%s\n",token,token);
printf("%s\t%s\n",token,token);
}
else if(strchr(doubleword,ch)>0)
{
/*輸入的是雙分界符*/
token[0]=ch;
ch=getc(fin);
if(ch=='=') /*如果是 = 則組合雙分界符*/
{
token[1]=ch;token[2]='\0';
ch=getc(fin);
}
else
{
token[1]='\0';
}
fprintf(fout,"%s\t%s\n",token,token);
printf("%s\t%s\n",token,token);
}
else if(ch=='/')
{
/*注釋處理*/
ch=getc(fin);
if(ch=='*')
{
ch1=getc(fin);
do
{
ch=ch1;
ch1=getc(fin);
}while((ch!='*'||ch1!='/')&&ch1!=EOF);
ch=getc(fin);
}
else
{
token[0]='/';
token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token); /*輸出單詞分界符*/
printf("%s\t%s\n",token,token);
}
}
else
{
/*無法識別的字符 */
token[0]=ch;
token[1]='\0';
ch=getc(fin);
err=3;
fprintf(fout,"%s\t%s\n","ERROR",token); /*輸出錯誤符號*/
printf("%s\t%s\n","ERROR",token);
}
}
return err;
}
void main()
{
int e=0;
e=TScan();
if(e>0)printf("編譯錯誤!");
else
printf("詞法分析成功!");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -