?? wordanalysis.txt
字號(hào):
//#include "stdafx.h"
#include "stdio.h"
#include "ctype.h"
#include "string.h"
#define wordlen 40 /*單詞最大長(zhǎng)度*/
/*保留字?jǐn)?shù)量*/
#define keywordSum 6
char *keyword[keywordSum]={"else","if","int","return","void","while"};
/*純單分界符*/
char singleword[11]="+-*(){};,:";
/*雙分界符*/
char doubleword[5]="<>=!";
char ScanInFile[100]; /*待分析的源程序文件*/
char ScanOutFile[100]; /*詞法分析后的輸出文件*/
FILE *fin,*fout; /*輸入輸出文件的指針*/
int LoadCodeFile()
{
/* 打開(kāi)待分析的 源代碼文件*/
printf("請(qǐng)輸入源程序文件名:");
scanf("%s",ScanInFile);
if((fin=fopen(ScanInFile,"r"))==NULL)
{
printf("\n找不到文件:%s\n文件打開(kāi)失敗!\n");
return 0;
}
else
return 1;
}
int CreatWordFile()
{
/*創(chuàng)建詞法分析后結(jié)果的輸出文件*/
int len=0;
int i=0;
/*??將原程序文件拷貝到輸出文件(當(dāng)前為空)?*/
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)
{
/*文件創(chuàng)建失敗*/
return 0;
}
else
return 1;
}
/*詞法分析程序*/
int TScan()
{
char ch,token[wordlen]; /*ch 為每次讀入的字符,token 為識(shí)別出來(lái)的單詞*/
char ch1; /*處理注釋時(shí) 用的臨時(shí)變量*/
int err=0; /* 設(shè)置錯(cuò)誤代碼為 0, 表示沒(méi)有錯(cuò)誤 */
int j,n; /*臨時(shí)變量,控制組合單詞時(shí)的數(shù)組下標(biāo)*/
if(LoadCodeFile()==0)
return 1; /*源代碼文件讀取失敗*/
if(CreatWordFile()==0)
return 2; /*文件創(chuàng)建失敗*/
/*fin輸入文件的指針,?getc()函數(shù)*/
ch=getc(fin);
while(ch!=EOF)
{
while(ch==' '||ch=='\n'||ch=='\t')
{
ch=getc(fin);
}
if(isalpha(ch))
{
/*輸入的是字母,進(jìn)行 標(biāo)示符 處理*/
token[0]=ch;
j=0;
while(isalnum(ch))
{
token[j++]=ch;
ch=getc(fin);
}/*如果是字母數(shù)字則組合,否則結(jié)束*/
token[j]='\0';
/*查找保留字*/
n=0;
while((n<keywordSum) && strcmp(token,keyword[n]))
n++;
if(n>=keywordSum)
{
/*輸出標(biāo)示符*/
fprintf(fout,"%s\t%s\n","ID",token);
printf("%s\t%s\n","ID",token);
}
else
{
/*輸出保留字*/
fprintf(fout,"%s\t%s\n","keyword",token);
printf("%s\t%s\n","keyword",token);
}
}
else if(isdigit(ch))
{
/*輸入的是數(shù)字,進(jìn)行 數(shù)字處理*/
token[0]=ch;
j=1;
ch=getc(fin);/*讀下一字符*/
while(isdigit(ch))
{/*如果是數(shù)字則整合數(shù)字*/
token[j++]=ch;
ch=getc(fin);
}
token[j]='\0';/*整數(shù)整合結(jié)束*/
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","single",token);
printf("%s\t%s\n","single",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","double",token);
printf("%s\t%s\n","double",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
{
/*無(wú)法識(shí)別的字符 */
token[0]=ch;
token[1]='\0';
ch=getc(fin);
err=3;
fprintf(fout,"%s\t%s\n","ERROR",token); /*輸出錯(cuò)誤符號(hào)*/
printf("%s\t%s\n","ERROR",token);
}
}
return err;
}
void main()
{
int e=0;
e=TScan();
if(e>0)printf("編譯錯(cuò)誤!");
else
printf("詞法分析成功!");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -