#include"stdio.h"
#include"conio.h"
#include"math.h"
#include"string.h"
#include"ctype.h"
typedef enum
{
START,IN1,IN2,IN3,INASSIGN,INNUM,INID,DONE
}StateType;
typedef enum
{
ENDFILE,COMMENT,KEYWORD,OTHER,ID
}TokenType;
FILE * fp1,* fp2;
char GetNextChar()
{
return fgetc(fp1);
}
void UnGetNextChar()
{
fseek(fp1,-1,SEEK_CUR);
}
TokenType getToken()
{
    char * KeyWords[8]={"if","begin","main","while","include","end","do","return"};
StateType state=START;
TokenType currentToken=OTHER;
char c,TokenString[500];
int iscomment=0,i=0,save=1;
while(state!=DONE)
{
c=GetNextChar();
save=1;
switch(state)
{
case START:
{
if(isdigit(c))
{
state=DONE;
currentToken=OTHER;
}
else if(isalpha(c))
{
state=INID;
}
else if(c=='/')
{
state=IN1;
}
else
if(c==EOF)
{
state=DONE;
save=0;
currentToken=ENDFILE;
}
else
{
state=DONE;
currentToken=OTHER;
} }break;
case IN1:
{
if(c=='*')
{
state=IN2;
}
else
{
state=DONE;
}
}break;
case IN2:
{
if(c=='*')state=IN3;
else
state=IN2;
}
case IN3:
{
if(c=='/')
{
state=DONE;
currentToken=COMMENT;
}
else
state=IN2;
}break;
case INID:
{
if(!isalpha(c))
{
state=DONE;
UnGetNextChar();
save=0;
currentToken=ID;
}
}break;
default:
{
currentToken=OTHER;
state=DONE;
}
}
   if(state==IN2)
{
   if(c>='a' && c<='z')
   TokenString[i++]=c-32;
   else
   TokenString[i++]=c;
}
    else
if(save)
TokenString[i++]=c;
if(state==DONE)
{
TokenString[i]='\0';
if(currentToken==ID)
{
for(int j=0;j<8;j++)
{
if(!strcmp(TokenString,KeyWords[j]))
{
for(int k=0;k<strlen(TokenString);k++)
TokenString[k]=TokenString[k]-32;
}
}
}
}
}
fputs(TokenString,fp2);
return currentToken;
}
void main()
{
char filename[13],newname[13];
long size,curr;
printf("请输入文件名:");
gets(filename);
if((fp1=fopen(filename,"r"))==NULL)
{
printf("File Open Error!");
return;
}
strcpy(newname,filename);
strcat(newname,".out");
fp2=fopen(newname,"w");
fseek(fp1,0,SEEK_END);
size=ftell(fp1);
rewind(fp1);
printf("\n");
while((getToken())!=ENDFILE)
{
curr=ftell(fp1);
printf("\n正在编译,已完成%d%%",curr*100/size);
}
printf("\nOK!!!!");
}
C