?? 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 + -