📄
字号:
#include<stdio.h>
#include<string.h>
//定义关键字结构
typedef struct
{
int type;
int order;
char str[7];
}keyword;
//定义标志符的结构
typedef struct
{
int type;
char str[7];
}signstr;
//定义常量的结构
typedef struct
{
int type;
char str[15];
}intconst;
//定义界符的结构
typedef struct
{
int type;
int order;
char str[3];
}operater;
//定义界符的结构
typedef struct
{
int type;
int order;
char str[3];
}board;
//预置关键字
struct
{
int order;
char a[10];
}initkey[13]={{1,"int"},{2,"char"},{3,"float"},{4,"main"},{5,"while"},{6,"break"},{7,"if"},{8,"else"},{9,"for"},{10,"until"},{11,"printf"},{12,"scanf"},{13,"end"}};
//预置运算符
struct
{
int order;
char b[3];
}initoperater[27]={{15,"+"},{16,"-"},{17,"*"},{18,"/"},{19,"%"},{20,"?"},{21,":"},{22,">"},{23,"<"},{24,"=="},{25,">="},{26,"<="},{27,"="},{28,"++"},{29,"--"},{30,"("},{31,")"},{32,"["},{33,"]"},{34,"{"},{35,"}"},{36,","},{37,";"},{38,"\\"},{39,"\""},{40,"\'"}};
//函数声明
void lexical();
void isWord();
void isNumber();
void other();
//////////////////
keyword keygroup[100];
signstr signgroup[100];
intconst constgroup[100];
operater operatergroup[100];
board boardgroup[100];
char ch;
int key_number=0,sign_number=0,con_number=0,ope_number=0,board_number=0;
FILE * fp;
//主函数
main()
{
int i;
if((fp=fopen("program.txt","r"))==0)
{
printf("can not open the file!\n");
}
else{
lexical();}
//fp=fopen("program.txt","r");
printf("\n");
printf("\t\t\t词法分析器\n");
printf("\n");
printf("---------------------------------------------------------------------\n");
while(!feof(fp))
{
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
putchar(10);
printf("---------------------------------------------------------------------\n");
printf("关键字\n");
printf(" 分类\t\t\t编号\t\t\t字符串\n");
for(i=0;i<key_number;i++)
{
printf("%d\t\t\t%d\t\t\t%s\n",keygroup[i].type,keygroup[i].order,keygroup[i].str);
}
printf("---------------------------------------------------------------------\n");
printf("标志符\n");
printf(" 分类\t\t\t\t\t\t字符串\n");
for(i=0;i<sign_number;i++)
{
printf("%d\t\t\t\t\t\t%s\n",signgroup[i].type,signgroup[i].str);
}
printf("---------------------------------------------------------------------\n");
printf("常数\n");
printf(" 分类\t\t\t\t\t\t常数\n");
for(i=0;i<con_number;i++)
{
printf("%d\t\t\t\t\t\t%s\n",constgroup[i].type,constgroup[i].str);
}
printf("---------------------------------------------------------------------\n");
printf("运算符\n");
printf(" 分类\t\t\t编号\t\t\t符号串\n");
for(i=0;i<ope_number;i++)
{
printf("%d\t\t\t%d\t\t\t%s\n",operatergroup[i].type,operatergroup[i].order,operatergroup[i].str);
}
printf("---------------------------------------------------------------------\n");
printf("界限符\n");
printf(" 分类\t\t\t编号\t\t\t符号串\n");
for(i=0;i<board_number;i++)
{
printf("%d\t\t\t%d\t\t\t%s\n",boardgroup[i].type,boardgroup[i].order,boardgroup[i].str);
}
printf("---------------------------------------------------------------------\n");
}
/////////////////////////////////////////////////////////////////////////////////
void lexical()
{ ch=fgetc(fp);
while(!feof(fp))
{
while((ch==32)||(ch==10))
ch=fgetc(fp); //去掉空格和分号
if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z')))
isWord();
else
{
if((ch>='0')&&(ch<='9'))
isNumber();
else
other();
}
}
}
/////////////////////////////////////////////////////////////////////////////////
void isWord()
{
char zmb[10]; //存字符串
int i=0;
int j=0;
int you=0;
int biaoyou=0;
zmb[i]=ch;
i++;
ch=fgetc(fp);
while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))
{
zmb[i]=ch;
i++;
ch=fgetc(fp);
}
zmb[i]='\0';
for(j=0;j<13;j++)
if(strcmp(zmb,initkey[j].a)==0)
{//printf("1,%s\n",zmb);
keygroup[key_number].type=1;
keygroup[key_number].order=initkey[j].order;
strcpy(keygroup[key_number].str,initkey[j].a);
key_number++;
biaoyou=1;
break;}
if(biaoyou==0)
{ for( i=0;i<sign_number;i++)
if(strcmp(zmb,signgroup[i].str)==0)
{ you=1;
break;}
if(you==0)
{strcpy(signgroup[sign_number].str,zmb);
signgroup[sign_number].type=2;
sign_number++;
}
}
you=0;
biaoyou=0;
}
/////////////////////////////////////////////////////////////////////////////////
void isNumber()
{
char csb[10];
int i=0;
csb[i]=ch;
i++;
ch=fgetc(fp);
while(((ch>='0')&&(ch<='9'))||(ch=='.'))
{ csb[i]=ch;
i++;
ch=fgetc(fp);
}
csb[i]='\0';
strcpy(constgroup[con_number].str,csb);
constgroup[con_number].type=3;
con_number++;
}
/////////////////////////////////////////////////////////////////////////////////
void other()
{
int i=0;
char fh[3];
fh[0]=ch;
if(fh[0]=='<'||fh[0]=='>'||fh[0]=='='||fh[0]=='!')
{ch=fgetc(fp);
if(ch=='=')
{
fh[1]=ch;
fh[2]='\0';
ch=fgetc(fp);
}
else
fh[1]='\0';
}
else if(fh[0]=='+'||fh[0]=='-')
{ ch=fgetc(fp);
//printf("%c\n",ch);
if(ch=='+'||ch=='-')
{
fh[1]=ch;
fh[2]='\0';
ch=fgetc(fp);
}
else
fh[1]='\0';
}
else
{
fh[1]='\0';
ch=fgetc(fp);
}
for(i=0;i<25;i++)
if(strcmp(initoperater[i].b,fh)==0)
{ if(initoperater[i].order>=30)
{
boardgroup[board_number].type=5;
boardgroup[board_number].order=initoperater[i].order;
strcpy(boardgroup[board_number].str,fh);
board_number++;
//printf("4,%d,%s",initoperater[i].order,initoperater[i].b);
}
else
{ operatergroup[ope_number].type=4;
operatergroup[ope_number].order=initoperater[i].order;
strcpy(operatergroup[ope_number].str,fh);
ope_number++;
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -