📄 词法分析.cpp
字号:
/**************词法分析.cpp*****************/
/*****************梁鹤**********************/
/***********实现模拟词法分析算法************/
/***********石油大学:2003.12.8 *************/
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
//fp 指向原文件temp.txt
FILE *fp,*fp2;
char buffer;
//保留字集合;
char *key[12]={"main","int","do","begin","else","end","if","then","while","for","cout","cin"};
//运算符集合;
char *one[13]={"=","<=","++","--",">=","!=","==","&&","||","+","-","*","/"};
//界符集合;
char *two[7]={"(",")","{","}",",","<<",";"};
//若为字母则检测下面的是否为字母或数字并判断是否为保留字
char alpha(char buffer)
{
int i=-1,n=0,k=0;
char p[20];
while ((isalpha(buffer))||(isdigit(buffer)))
{
p[++i]=buffer;
buffer=fgetc(fp);
n++;
};
p[i+1]='\0';
for(i=0;i<12;i++)
{
if(strcmp(key[i],p)==0)
{
cout<<"保留字";
k=1;
}
}
if(k==0)cout<<"标识符 ";
for(i=0;i<10;i++)
{
if(p[i]=='\0')break;
else cout<<p[i];
fputc(p[i],fp2);
}
cout<<endl;
return(buffer);
}
//若为数字则检测下面的是否为数字;
char digit(char buffer)
{
int i=-1;
char p[10];
while ((isdigit(buffer)))
{
p[++i]=buffer;
buffer=fgetc(fp);
}
p[i+1]='\0';
cout<<"常数 ";
for(i=0;i<10;i++)
{
if(p[i]=='\0')break;
else
{
cout<<p[i];
fputc(p[i],fp2);
}
}
cout<<endl;
return(buffer);
}
//若为符号则检测下面的是否为符号;
char other(char buffer)
{
int i=-1,k,m,num;
char p[10],q[3],qq[2];
while ((!isalpha(buffer))&&(!isdigit(buffer))&&(buffer!=' '))
{
p[++i]=buffer;
buffer=fgetc(fp);
};
num=i+1;
p[i+1]='\0';
q[2]='\0';
qq[1]='\0';
//先取两个判断是否为运算符号或界符 若是则输出指针向后指两个位置;
//若不是 则取第一个判断,指针向后指一个位置;
for(i=0;i<num;i++)
{
qq[0]=p[i];
m=0;
if(p[i+1]!='\0')
{
q[0]=p[i];
q[1]=p[i+1];
for(k=0;k<13;k++)
{
if(strcmp(one[k],q)==0)
{
cout<<"运算符 "<<p[0]<<p[1]<<endl;m=1;i++;
fputc(p[0],fp2);
fputc(p[1],fp2);
}
}
if(m!=1)
{
for(k=0;k<7;k++)
{
if(strcmp(two[k],q)==0)
{
cout<<"界符 "<<p[0]<<p[1]<<endl;m=1;i++;
fputc(p[0],fp2);
fputc(p[1],fp2);
}
}
}
}
if(m!=1)
{
for(k=0;k<13;k++)
{
if(strcmp(one[k],qq)==0)
{
cout<<"运算符 "<<qq[0]<<endl;
fputc(qq[0],fp2);
}
}
for(k=0;k<7;k++)
{
if(strcmp(two[k],qq)==0)
{
cout<<"界符 "<<qq[0]<<endl;
fputc(qq[0],fp2);
}
}
}
}
return(buffer);
}
void main()
{
//打开原文件temp并检查是否出错;
if((fp=fopen("temp.txt","r"))==NULL)
cout<<"打开文件出错";
else
{
//生成一个文件temp2存分析后的结果;
fp2=fopen("temp2.txt","w");
buffer=fgetc(fp);
//当指针指到文件结尾的时候跳出循环
while (!feof(fp))
{
//检测当前指针是空格,数字,字符还是其他 并调用相应的函数处理;
if(buffer==' ')
buffer=fgetc(fp);
else if (isalpha(buffer))
buffer=alpha(buffer);
else if (isdigit(buffer))
buffer=digit(buffer);
else buffer=other(buffer);
};
cout<<"完成:)"<<endl;
//关闭生成文件temp2;
fclose(fp2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -