📄 词法分析.cpp
字号:
#include"stdio.h" //strchr
#include"iostream.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h" //isalnum,isdigit,isalpha,
#define keyword 40
#define fuhao 45
#define yunsuan 9
char yun[yunsuan]="+-*/=><!";
#define fenge 8
char fen[fenge]=",.;{}()";
char *a[keyword]={"auto","break","case","char","class","const","continue","default","delete","do","double","else","enum","extern","float","for","friend","if","inline","int","long","new","operator","private","protected","public","register","return","short","sizeof","static","struct","switch","template","this","typedef","union","virtual","void","while"};
char *b[fuhao]={"+","-","*","/","%","++","--",">",">=","<","<=","==","!=","&&","||","!","<<",">>","~","|","^","&","=","+=","-=","*=","/=","%=",">>=","<<=","&=","^=","|=",",","->",".","[","]","(",")","::","{","}","#",";"};
char ch;
int i,k;
char buff[20];
void zhuan(char a[],int n);
void output(int ,char*);
void zhuyao(FILE *fp)
{ int j;
ch=fgetc(fp);
while(ch==' '||ch=='\n'||ch=='\t')
{ch=fgetc(fp);}
if(isalpha(ch)) /*输入的是字母,进行 标识符处理*/
{
buff[0]=ch;
i=1;
ch=fgetc(fp);
while(isalnum(ch)) //如果本函数的变元为字母或数字,它将返回非零值,否则返回零值。
/*如果是字母数字则组合,否则结束*/
{
buff[i]=ch;
i++;
ch=fgetc(fp); //从流中读取字符
}
buff[i]='\0'; /*查找保留字*/
fseek(fp,-1,1);
j=0;
while((j<keyword)&&strcmp(buff,a[j]))
j++;
if(j>=keyword)
output(300,buff);
else
output(100+j+1,buff);
}
else
if(isdigit(ch))
{
buff[0]=ch;
ch=fgetc(fp);
i=1;
while(isdigit(ch)) // 判断字符c是否为数字 /*如果是数字则整合数字*/
{
buff[i]=ch;
i++;
ch=fgetc(fp);
}
buff[i]='\0'; /*整数整合结束*/
cout<<"< "<<400<<" "<<","<<" ";
zhuan(buff,i);
fseek(fp,-1,1);
}
else
if(strchr(fen,ch)>0) /*分隔符号*/
{
buff[0]=ch;
ch=fgetc(fp);
buff[1]='\0';
fseek(fp,-1,1);
k=0;
while((k<fuhao)&&strcmp(buff,b[k]))
k++;
if(k<fuhao)
output(200+k+1,buff);
}
else
if(strchr(yun,ch)>0) /*运算符号*/
{
buff[0]=ch;
ch=fgetc(fp);
if(buff[0]=='/'&&ch=='*')
{
while(ch!='/')
{
ch=fgetc(fp);
}
}
else
if(buff[0]=='/'&&ch=='/')
{
while(ch!='\n')
{
ch=fgetc(fp);
}
}
else
{
i=1;
while(strchr(yun,ch)>0)
{
buff[i]=ch;
i++;
ch=fgetc(fp);
}
buff[i]='\0';
fseek(fp,-1,1);
k=0;
while((k<fuhao)&&strcmp(buff,b[k]))
k++;
if(k<fuhao)
output(200+k+1,buff);
}
}
else
{
buff[0]=ch;
buff[1]='\0';
ch=fgetc(fp); //从流中读取字符
fseek(fp,-1,1);//重定位流上的文件指针
}
}
void zhuan(char a[],int n) /*二进制转换函数*/
{
long data=0,t=1;
int i,j=0;
int c[20];
for(i=n-1;i>=0;--i){
data+=(a[i]-'0')*t;
t*=10;
}
if(data==0)
cout<<"0";
else{
while(data){
c[j++]=data%2;
data/=2;
}
cout<<"";
for(i=j-1;i>=0;--i)
cout<<c[i];
cout<<""<<">"<<endl;
}
}
void output(int n,char *m) /*输出格式*/
{ printf("< %-2d , %s>\n",n,m);}
void main() /*主函数*/
{FILE *fp;
char filename[20],sh;
printf("Type the file name which you want to open:");
scanf("%s",&filename);
fp=fopen(filename,"r"); /*以只读方式打开指定文件*/
if((fp=fopen(filename,"r"))==NULL) /*文件不存在输出错误*/
{printf("File does not exist!");exit(-1);}
cout<<"文件中内容如下:"<<endl;
while(!feof(fp)){
sh=fgetc(fp);//从流中读取字符
cout<<sh;
}
cout<<endl;
rewind(fp); // 将文件指针重新指向一个流的开头
cout<<"分析情况(注释符已经剔除)如下:"<<endl;
while(ch!=EOF)
zhuyao(fp);
fclose(fp); //关闭一个流
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -