📄 main.c
字号:
#include<stdio.h>
#include<string.h>
#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=10,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=i+1;
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!=10){
wd.syn=c;
strcpy(wd.value,token);
return wd;
}
else{
wd.syn=10;
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=11;
strcpy(wd.value,token);
return wd;
}
else{
switch(ch){ //判断可识别字符
case '+': ch=fgetc(fp);
if(ch=='+'){
wd.syn=13;
wd.value[0]='+';
wd.value[1]='+';
wd.value[2]='\0';
return wd;
break;
}
fseek(fp,-1L,1);
wd.syn=25;
wd.value[0]='+';
wd.value[1]='\0';
return wd;
break;
case '-': wd.syn=14;
wd.value[0]='-';
wd.value[1]='\0';
return wd;
break;
case '*': wd.syn=15;
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;
}
else
if(ch!='/'){
wd.syn=-1;
return wd;
}
wd.syn=16;
wd.value[0]='/';
wd.value[1]='\0';
fseek(fp,-1L,1);
return wd;
break;
case '<': ch=fgetc(fp);
if(ch=='='){
wd.syn=26;
wd.value[0]='<';
wd.value[1]='=';
wd.value[2]='\0';
return wd;
break;
}
fseek(fp,-1L,1);
wd.syn=18;
wd.value[0]='<';
wd.value[1]='\0';
return wd;
break;
case ';': wd.syn=24;
wd.value[0]=';';
wd.value[1]='\0';
return wd;
break;
case '(': wd.syn=20;
wd.value[0]='(';
wd.value[1]='\0';
return wd;
break;
case ')': wd.syn=21;
wd.value[0]=')';
wd.value[1]='\0';
return wd;
break;
case '{': wd.syn=22;
wd.value[0]='{';
wd.value[1]='\0';
return wd;
break;
case '}': wd.syn=23;
wd.value[0]='}';
wd.value[1]='\0';
return wd;
break;
case ',': wd.syn=19;
wd.value[0]=',';
wd.value[1]='\0';
return wd;
break;
case '=': wd.syn=17;
wd.value[0]='=';
wd.value[1]='\0';
return wd;
break;
default : wd.syn=-1;
return wd;
break;
}
}
}
int main(){
WS wd;
ch=0;
if((fp=fopen("file.txt","r+"))==NULL) printf("文件打开失败");
while(ch!=EOF){
wd=scaner();
if(wd.syn!=-1) {
print(&wd);
printf("\n");
}
}
fclose(fp);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -