📄 czh.cpp
字号:
#include "iostream.h"
#include "stdio.h"
#include "ctype.h"
#include"stdlib.h"
#include"string.h"
#include "iomanip.h"
#include"setcolor.h"
class RS
{
public:
RS(){}
~RS(){}
//void set();
void listall();
char *setname(char name[255]){return name;}
char *settype(char type[20]){return type;}
char name[255];
char type[20];
int idx,idy;
};
void RS::listall()
{
cout<<setiosflags(ios::left)<<setw(15)<<name<<setw(15)<<type<<"("<<idx<<","<<idy<<")"<<endl;
}
RS rs[1000];
int rsnum=0;
#define MAX 9 //分析表的最大容量
#define MAXBUF 255
char ch =' '; // 存放读入当前的输入字符
int lineno;
char tr[MAXBUF];
struct mykey //关键字
{
char lexptr[MAXBUF];
int token;
};
struct mykey symtable[MAX];
char * str[]={"main","void","cout","cin","if","else","int","float","double","while" };//"include",
void init() //对符号表进行初始化
{
for( int j=0; j<9; j++)
{
strcpy(symtable[j].lexptr,str[j]);
symtable[j].token=j+2;
}
}
int search(char *temp)
{
for(int i=0;i<18;i++) {
if(!strcmp(symtable[i].lexptr ,temp))
{
return symtable[i].token;
}
}
return 0;
}
void Analyse(FILE *fpin,FILE *fpout) //分析主程序
{
char arr[MAXBUF],arrtemp[MAXBUF];
int i=0;
int j=0,k=0;
int y=0;
while((ch=fgetc(fpin))!=EOF) //读入字符判断,(换行符、空格、字母、数字、界符)
{
rsnum++;
if(ch==' '||ch=='\t')
{
rsnum--;
}
else if(ch=='\n') //如果是换行符,则行号加1
{
rsnum--;
lineno++;
y=0;
}
else if(isdigit(ch)) //如果是数字
{
while(isdigit(ch)) //判断和读取数字
{
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
if(ch=='.'){
arr[j]=ch;j++;
ch=fgetc(fpin);
while(isdigit(ch)) //判断和读取小数点后的数字
{
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
}
arr[j]='\0';
j=0;
fseek(fpin,-1L,SEEK_CUR);
strcpy(rs[rsnum].name,rs[rsnum].setname(arr));
strcpy(rs[rsnum].type,rs[rsnum].settype("2"));
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",arr,2,lineno,rs[rsnum].idy) ;
}
else if (isalpha(ch)) //如果是字母时
{
while(isalpha(ch)||isdigit(ch))
{
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
arr[j]='\0';
j=0;
if (search(arr)) //如果是关键字
{
strcpy(rs[rsnum].name,arr);
strcpy(rs[rsnum].type,"关键字");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",arr,search(arr),lineno,rs[rsnum].idy);
}
else
{
strcpy(rs[rsnum].name,arr);
strcpy(rs[rsnum].type,"1");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",arr,1,lineno,rs[rsnum].idy); //普通标志符
}
}
else if(ch=='!')
{
arrtemp[0]=ch;char cht;cht=ch;
ch=fgetc(fpin);
if(ch=='=')
{arrtemp[1]=ch;arrtemp[2]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"21");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","!=",21,lineno,rs[rsnum].idy); //如果是 !=
}
else
{
arrtemp[1]='\0';//j=0;
arrtemp[0]=cht;
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"22");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","!",22,lineno,rs[rsnum].idy); //如果是 !
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='=')
{
arrtemp[0]=ch;char cht;cht=ch;
ch=fgetc(fpin);
if(ch=='=')
{
arrtemp[1]=ch;arrtemp[2]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"23");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","==",23,lineno,rs[rsnum].idy); //如果是 ==
}
else
{
arrtemp[1]='\0';
arrtemp[0]=cht;
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"24");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","=",24,lineno,rs[rsnum].idy); //如果是 =
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='<')
{
arrtemp[0]=ch;char cht;cht=ch;
ch=fgetc(fpin);
if(ch=='<')
{
arrtemp[1]=ch;arrtemp[2]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"25");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","<<",25,lineno,rs[rsnum].idy); // 如果是 <<
}
else if(ch=='=')
{
arrtemp[1]='\0';
arrtemp[0]=cht;
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"26");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","<=",26,lineno,rs[rsnum].idy); //如果是 <=
}
else
{
arrtemp[1]='\0';
arrtemp[0]=cht;
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"27");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","<",27,lineno,rs[rsnum].idy); //如果是 <
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='>')
{
arrtemp[0]=ch;char cht;cht=ch;
ch=fgetc(fpin);
if(ch=='>')
{
arrtemp[1]=ch;arrtemp[2]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"28");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",">>",28,lineno,rs[rsnum].idy); // 如果是 >>
}
else if(ch=='=')
{
arrtemp[1]=ch;arrtemp[2]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"29");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",">=",29,lineno,rs[rsnum].idy); //如果是 >=
}
else
{
arrtemp[1]='\0';
arrtemp[0]=cht;
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"30");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",">",30,lineno,rs[rsnum].idy); //如果是 >
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='/')
{
ch=fgetc(fpin);
if(ch=='*')
{
ch=fgetc(fpin);
s: //goto come here
while(ch!='*')
{
ch=fgetc(fpin);
}
while(ch=='*')
{
ch=fgetc(fpin);
while(ch!='/')
{
goto s; //如果是注释 /* */
}
}
}
else if(ch=='/')
{
ch=fgetc(fpin);
while(ch!='\n')
{
ch=fgetc(fpin); //如果是注释 //
}
}
else
{
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","/",31,lineno,rs[rsnum].idy);
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='+')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"32");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","+",32,lineno,rs[rsnum].idy);
}
else if(ch=='-')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"33");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","-",33,lineno,rs[rsnum].idy);
}
else if(ch=='*')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"34");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","*",34,lineno,rs[rsnum].idy);
}
else if(ch=='%')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"35");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","%",35,lineno,rs[rsnum].idy);
}
else if(ch=='(')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"36");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","(",36,lineno,rs[rsnum].idy);
}
else if(ch==')')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"37");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",")",37,lineno,rs[rsnum].idy);
}
else if(ch=='[')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"38");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","[",38,lineno,rs[rsnum].idy);
}
else if(ch==']')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"39");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","]",39,lineno,rs[rsnum].idy);
}
else if(ch=='"')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"40");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","”",40,lineno,rs[rsnum].idy);
}
else if(ch==';')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"41");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",";",41,lineno,rs[rsnum].idy);
}
else if(ch=='=')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"42");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","=",42,lineno,rs[rsnum].idy);
}
else if(ch==',')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"43");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n",",",43,lineno,rs[rsnum].idy);
}
else if(ch=='{')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"44");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","{",44,lineno,rs[rsnum].idy);
}
else if(ch=='}')
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"45");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%s\t\t%d\t%d\t%d\n","}",45,lineno,rs[rsnum].idy);
}
else
{
arrtemp[0]=ch;arrtemp[1]='\0';
strcpy(rs[rsnum].name,arrtemp);
strcpy(rs[rsnum].type,"非法字符");
rs[rsnum].idx=lineno;
rs[rsnum].idy=++y;
fprintf(fpout,"%c\t\t非法\t%d\t%d\n",ch,lineno,rs[rsnum].idy);
}
}
}
void main()
{
//setcolor(6,12);
void Analyse(FILE *fpin,FILE *fpout);
char filenamein[10];
char filenameout[10];
setcolor(20,10);
cout<<"-------------------------------------------------"<<endl;
cout<<"--------------------词法分析器-------------------"<<endl;
cout<<" 2004级计算机一班"<<endl;
cout<<" 姓名:常振华 学号:20041783"<<endl;
//cout<<("直接输入源代码请按1,从文件中读入源代码请按2 \n") ;
cout<<"请输入源代码文件名:";
cin>>filenamein;
cout<<endl;
//scanf("%s",filenamein);
printf("请输入保存词法分析结果的文件名:");
//cin>>filenameout;
scanf("%s",filenameout);
FILE* fpin=fopen(filenamein,"r");
FILE* fpout=fopen(filenameout,"w");
init();
cout<<"分析结果如下:"<<endl;
setcolor(6,12);
cout<<"序号 单词 类型 行列号 "<<endl;
setcolor(20,10);
Analyse(fpin,fpout);
fclose(fpin);
fclose(fpout);
for(int i=1;i<=rsnum;i++)
{
if(rs[i].name!=NULL)
{
cout<<setiosflags(ios::left)<<setw(10)<<i;
rs[i].listall();
}
}
cout<<"end program: "<<endl;
setcolor(6,12);
cout<<"分析结束!"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -