帮忙看下里面的程序,谢谢大家

ericshaohui456 2009-06-10 02:12:30
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


char GETCH(FILE *f1,int *CC,char *LINE) //取字符
{
char CH='\0',c;
int i=1;
if(LINE[*CC+1]=='\0')
{
c=fgetc(f1);
if(c==EOF)
{
printf("文件结束!\n");
return 0;
}
else
{
while(c!='\n')
{
LINE[i++]=c;
c=fgetc(f1);
}
LINE[i]='\0';
*CC=0;
}
}
*CC=*CC+1;
CH=LINE[*CC];
return CH;
}

int GETSYM(FILE *f1,FILE *f2,int *CC,char *LINE) //分词
{
char A[10],ID[10],NUM[10],C[2],B[3],CH;
int k,i,j,tag;
char *key[]={"auto","break","case","char","else","const","continue","default","do","double",
"enum","extern","float","for","goto","if","int","long","register",
"short","signed","sizeof","static","struct","switch","typedef",
"union","unsigned","void","volatile","while"}; //关键字
char *limit[]={"(",")","[","]", ".",",",";","{","}","#","_","'","<",">","+","-"};//界符
char *operation[]={"->","!","++","--","&","~","*","/","%","<<",">>",
"<","<=",">=","==","!=","&&","||","=","+=","-=","*=","/=",};//双界符
CH=GETCH(f1,CC,LINE);
if(CH==' ') //滤空格
return 0;
else if(((CH>='A')&&(CH<='Z'))||((CH>='a')&&(CH<='z'))) //判断是否为字母
{
k=-1;
tag=1;
while(tag)
{
tag=0;
if(k<9)
{
k=k+1;
A[k]=CH;
}
CH=GETCH(f1,CC,LINE);
if(((CH>='A')&&(CH<='Z'))||((CH>='a')&&(CH<='z'))||((CH>='0')&&(CH<='9')))//判断是否为字母或数字
tag=1;
else
tag=0;
}
for(i=0;i<=k;i++)
ID[i]=A[i];
ID[k+1]='\0';
for(i=0;i<31;i++)
if(strcmp(key[i],ID)==0) //判断是否为关键字
{
fprintf(f2,"KeyWord %-s\n",ID);
return 1;
}
fprintf(f2,"Word %-s\n",ID); //判断是否为标识符
return 1;
}
else if((CH>='0')&&(CH<='9')) //判断是否为常数
{
j=0;
while((CH>='0')&&(CH<='9'))
{
NUM[j++]=CH;
CH=GETCH(f1,CC,LINE);
}
NUM[j]='\0';
fprintf(f2,"Digit %-s\n",NUM);
return 1;
}
else
{
C[0]=CH;
C[1]='\0';
CH=GETCH(f1,CC,LINE);
B[0]=C[0];
B[1]=CH;
B[2]='\0';
for(i=0;i<22;i++)
if(strcmp(operation[i],B)==0) //判断是否为双界符
{
fprintf(f2,"DoubleWord %-s\n",B);
return 0;
}
for(i=0;i<16;i++)
if(strcmp(limit[i],C)==0) //判断是否为界符
{
fprintf(f2,"SingleWord %-s\n",C);
return 1;
}
for(i=0;i<22;i++)
if(strcmp(operation[i],C)==0) //判断是否为双界符
{
fprintf(f2,"DoubleWord %-s\n",C);
return 1;
}
fprintf(f2,"ERROR %-s\n",C); //判断是否为未识别符
return 1;
}
return 2;
}


int main()
{
FILE *f1,*f2;
int CC=0,tag;
char LINE[81];
LINE[1]='\0';

f1=fopen("source.txt","rt"); //待词法分析的文件
if(f1==NULL)
{
printf("文件source.txt未打开!");
exit(0);
}
f2=fopen("lex.txt","wt"); //词法分析的结果
if(f2==NULL)
{
printf("文件lex.txt未打开!");
exit(0);
}
while(!feof(f1))
{
tag=GETSYM(f1,f2,&CC,LINE);//tag为0 则读取下一个字符
if(tag==1)//tag为1 则读取当前字符
CC--;
if(tag==2)//tag为2 报错
printf("Wrong!");
}
fclose(f1);
fclose(f2);
return 0;
}

运行出来结果是:
KeyWord if
SingleWord (
Word i
SingleWord >
Digit 1
SingleWord )
Word return
Digit 1
SingleWord ;
Word elsereturn
Digit 0
SingleWord ;

可我想要的结果是:
KeyWord if
SingleWord (
Word i
SingleWord >
Digit 1
SingleWord )
Word return
Digit 1
SingleWord ;
KeyWord else
Word return

Digit 0
SingleWord ;

大家帮忙看看,谢谢啦
...全文
23 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧