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

ericshaohui456 ericshaohui456 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#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 ;

大家帮忙看看,谢谢啦
...全文

相关推荐

高级C++程序设计喜欢的看下

通过`try`、`catch`和`throw`关键字,程序员可以捕获和处理可能出现的异常情况,确保程序的健壮性。4. **命名空间(Namespaces)**:命名空间用于避免全局作用域中的名字冲突。

m4andak123

c++大程序 学习c++都应该看下 我个人觉得很实用

"这篇资源主要涉及的是C++编程的学习,特别是关于编写大型程序的实践。在C++编程中,编写大型程序通常涉及到更复杂的类结构和代码组织。资源中的问题是一个C++大作业示例,它要求设计一个具有三层类结构

i凌恒

红外遥控解码程序,对想更深入了解的可以看下

在编程实现红外遥控解码程序时,需要注意硬件连接,例如文中提到的P3.0、P3.1用于串口调试,P3.2连接红外接收管的数据线。程序中会包含初始化串口、数据传输和获取按键值等功能函数。

hymanshan

方波变正弦波C程序,做DDS信号发生器的可以看下

在本案例中,我们关注的是一个C程序,它将方波转换为正弦波,这对于理解DDS的工作原理以及设计简单的信号发生器非常有帮助。首先,我们讨论方波和正弦波。

Steven_Dongboss

三星 S22A330BW 固件

液晶显示器的固件程序,才找到的,有空的可以看下。液晶显示器的固件程序,才找到的,有空的可以看下液晶显示器的固件程序,才找到的,有空的可以看下液晶显示器的固件程序,才找到的,有空的可以看下液晶显示器的固

mbbvm
评论
收藏 已收藏
分享
返回顶部
ericshaohui456
C语言 70,039 成员 243,237 内容