📄 main.c
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<math.h>
#include<process.h> /* exit() */
#define MAX 20
typedef struct //二元组
{
int syn; //种别码
char value[MAX]; //单词符号
}WS;
char ch;
FILE *fp;
void getbc() //检查ch是否为空白符,是的话,继续取下一个字符,直到不为空
{
while(ch==' ') ch=fgetc(fp);
}
int letter() //判断ch是否为字母
{
if((ch>='A')&&(ch<='Z')||(ch>='a')&&(ch<='z')) return 1;
else return 0;
}
int digit() //判断ch是否为数字
{
if((ch>='0')&&(ch<='9')) return 1;
else return 0;
}
int reserve(char *token) //查关键字表,判断token中的字符串是否为关键字
{
int key=300,i;
char WORDS_KEY[8][20]={"main","int","char","if","else","for","while","void"};
for(i=0;i<8;i++)
if(strcmp(token,WORDS_KEY[i])==0) {key=300+i; break;}
return key;
}
void error() //错误调用函数
{
printf("There has some unlawful words!");
}
print(WS *wd) //打印函数
{
printf("<%d, %s>",wd->syn,wd->value);
}
WS scaner() //扫描函数,主要算法
{
char token[20];
WS wd;
int c;
int i=0;
ch=fgetc(fp);
getbc(fp);
if(letter()) //是否为字母,是的话继续取字符,直到取的词不是字母或数字。调用reserve(char *token)判断是否为关键字。
{
while(letter()||digit())
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
token[i]='\0';
fseek(fp,-1L,1); //退一个字符
c=reserve(&token);
if(c!=300) { wd.syn=c;strcpy(wd.value,token); return wd;}
else { wd.syn=300;strcpy(wd.value,token);return wd;}
}
else if(digit()) //是否为数字,是的话继续取字符,直到取的词不是数字。
{
while(digit())
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
fseek(fp,-1L,1);
token[i]='\0';
wd.syn=400;strcpy(wd.value,token);return wd;
}
else
{
switch(ch) //判断可识别字符
{
case '+': ch=fgetc(fp);
if(ch=='+') {wd.syn=206;wd.value[0]='+';wd.value[1]='+'; wd.value[2]='\0'; return wd; break;}
if(ch=='=') {wd.syn=224;wd.value[0]='+';wd.value[1]='='; wd.value[2]='\0'; return wd; break;}
fseek(fp,-1L,1);
wd.syn=201;wd.value[0]='+'; wd.value[1]='\0'; return wd; break;
case '-': ch=fgetc(fp);
if(ch=='-') {wd.syn=207;wd.value[0]='-';wd.value[1]='-'; wd.value[2]='\0'; return wd; break;}
if(ch=='=') {wd.syn=225;wd.value[0]='-';wd.value[1]='='; wd.value[2]='\0'; return wd; break;}
fseek(fp,-1L,1);
wd.syn=202;wd.value[0]='-'; wd.value[1]='\0'; return wd; break;
case '*': wd.syn=203;wd.value[0]='*'; wd.value[1]='\0'; return wd; break;
case '/': ch=fgetc(fp);
if(ch=='*')
{
while(1)
{
ch=fgetc(fp);
if(ch=='*')
{
ch=fgetc(fp);
if(ch=='/')
break;
}
}
wd.syn=-1; return wd;
break;
}
if(ch=='/')
{
wd.syn=-1;
return wd;
break;
}
fseek(fp,-1L,1);wd.syn=204;wd.value[0]='/'; wd.value[1]='\0'; return wd; break;
case '<': ch=fgetc(fp);
if(ch=='='){ wd.syn=211;wd.value[0]='<';wd.value[1]='='; wd.value[2]='\0'; return wd; break;}
fseek(fp,-1L,1);
wd.syn=210;wd.value[0]='<'; wd.value[1]='\0'; return wd; break;
case '>': ch=fgetc(fp);
if(ch=='='){ wd.syn=209;wd.value[0]='>';wd.value[1]='='; wd.value[2]='\0'; return wd; break;}
fseek(fp,-1L,1);
wd.syn=208;wd.value[0]='>'; wd.value[1]='\0'; return wd; break;
case ';': wd.syn=245;wd.value[0]=';'; wd.value[1]='\0'; return wd; break;
case '(': wd.syn=239;wd.value[0]='('; wd.value[1]='\0'; return wd; break;
case ')': wd.syn=240;wd.value[0]=')'; wd.value[1]='\0'; return wd; break;
case '{': wd.syn=242;wd.value[0]='{'; wd.value[1]='\0'; return wd; break;
case '}': wd.syn=243;wd.value[0]='}'; wd.value[1]='\0'; return wd; break;
case ',': wd.syn=234;wd.value[0]=','; wd.value[1]='\0'; return wd; break;
case '=': wd.syn=223;wd.value[0]='='; wd.value[1]='\0'; return wd; break;
default : wd.syn=-1; return wd;break;
}
}
}
main()
{
WS wd;
ch=0;
if((fp=fopen("LYF.txt","r+"))==NULL) printf("文件打开失败");
while(ch!=EOF)
{
wd=scaner(fp);
if(wd.syn!=-1)
{ print(&wd);printf("\n");}
}
fclose(fp);
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -