📄 1.cpp
字号:
/*
C语言词法分析程序
4.25
*/
#include<stdio.h>
#include <string.h>
#include "2.h"
#define KEYNUM 32
//output form
struct output
{
int type;
int value;
int lineno;
//int column;
};
//keywords
char keywords[KEYNUM][10]={
"auto","break","case","char","const","continue",
"default","do","double","else","enum","extern",
"float", "for","goto","if","int","long","register",
"return","short","signed","sizeof","static","struct",
"switch","typedef","union","unsigned","void","volatile",
"while",
};
//符号表
char symbol1[SYMBOLNUM]={'!','@','#','$','%','^','&','*','(',')',
'\\',
'-','=','_','+',
'|',
'{','}','[',']',':',';','"',
'\'',
'<',',','>','.','?','/',
};
char symbol2[20][3]={"->","++","--","<<",">>","<=",">=","==","!=","&&",
"||","?:","+=","-=","*=","/=","%=","&=","^=","|="
};
char token[50];//保存分析到的一个单词。
bool isasymbol2(char *token)
{ for(int i=0;i<20;i++)
if(strncmp(symbol2[i],token,strlen(symbol2[i]))==0)return true;
return false;
}
bool isakey(char *token)
{
for(int i=0;i<32;i++)
if(strncmp(keywords[i],token,strlen(keywords[i]))==0)return true;
return false;
}
void fengxi(char *buf,char* symbol,int num,int lineno,FILE *fp)
{
char c;
for(int i=0;i<num;)
{
char token[32];
int ti=0;//token count
char number[50];
int tn=0;//number count
int j;//临时变量
int state=-1;// 0 标识符 1 常数 2界限符 -1非法字符 3字符串 4字符
c=buf[i];
for(j=0;j<32;j++)
token[j]=' ';
if(c=='"') state=3;
else if(c=='\'') state=4;
else if(isaletter(c)||c=='_')state=0;
else if(isanumber(c))state=1;
else if(c==' '||c==9){i++;continue;}//9是TAB
else if(isasymbol(c,symbol)) state=2;
switch(state)
{
case 0://标识符
while(isaletter(c)||isanumber(c)||c=='_')
{
if(i==num)break;
token[ti++]=c;
// printf("%c 标识符\n",c);
c=buf[++i];
}
for(j=0;j<ti;j++)
{
printf("%c",token[j]);
fprintf(fp,"%c",token[j]);
}
if(isakey(token))
{
printf(" 关键字 行%d\n",lineno);
fprintf(fp," 关键字 行%d\n",lineno);
}
else
{
printf(" 标识符 行%d\n",lineno);
fprintf(fp," 标识符 行%d\n",lineno);
}
break;
case 1://常数
if(buf[i-1]=='+'||buf[i-1]=='-')number[tn++]=buf[i-1];
while(isanumber(c))
{
if(i==num)break;
number[tn++]=c;
//printf("%c 常数\n",c);
c=buf[++i];
}
for(j=0;j<tn;j++)
{
printf("%c",number[j]);
fprintf(fp,"%c",number[j]);
}
printf(" 常数 行%d\n",lineno);
fprintf(fp," 常数 行%d\n",lineno);
break;
case 2://界限符
//二元界限符
{
char local[3];
local[0]=c;
local[1]=buf[i+1];
for(int j=0;j<20;j++);
if(isasymbol2(local))
{
local[2]='\0';
printf("%s 二元界限符 行%d\n",local,lineno);
fprintf(fp,"%s 二元界限符 行%d\n",local,lineno);
i=i+2;
break;
}
//zhao dao
// break;
}
if(c=='+'||c=='-')//一元界限符
{
if(isanumber(buf[i+1]))
{
i++;
break;
}
}
i++;
printf("%c 界限符 行%d\n",c,lineno);
fprintf(fp,"%c 界限符 行%d\n",c,lineno);
break;
case 3://字符串
{
char local[50];
int j=1;
local[0]='"';
c=buf[++i];
while(c!='"')
{
local[j]=c;
c=buf[++i];
j++;
}
local[j++]=buf[i++];
local[j]='\0';
printf("%s 字符串 行%d\n",local,lineno);
fprintf(fp,"%s 字符串 行%d\n",local,lineno);
break;
}
case 4://字符
{
char local[5];
int j=1;
local[0]='\'';
c=buf[++i];
while(c!='\'')
{
local[j]=c;
c=buf[++i];
j++;
}
local[j++]=buf[i++];
local[j]='\0';
printf("%s 字符 行%d\n",local,lineno);
fprintf(fp,"%s 字符 行%d\n",local,lineno);
break;
}
case -1://非法字符
i++;
printf("%c 非法字符 行%d\n",c,lineno);
fprintf(fp,"%c 非法字符 行%d\n",c,lineno);
break;
}//end switch
}//end for
}
int main()
{
//文件打开
int num=0;
FILE *fp;
FILE *fp1;
FILE *fp2;
int lineno=0;
if((fp1=fopen("源代码.txt","r"))==NULL)
{
printf("不能打开文件\n");
return 0;
}
if((fp2=fopen("去注释后.txt","w"))==NULL)
{
printf("不能打开文件\n");
return 0;
}
quzhushi(fp1,fp2);
fclose(fp1);
fclose(fp2);
if((fp=fopen("去注释后.txt","r"))==NULL)
{
printf("不能打开文件\n");
return 0;
}
if((fp1=fopen("词法分析结果.txt","w"))==NULL)
{
printf("不能打开文件\n");
return 0;
}
//处理
while(num!=-1)
{
char buf[50];//保存读入的一行
// printf("\n");
num=getline(buf,fp,'\n');
if(num>0)
{
putline(buf,num);
lineno++;
fengxi(buf,symbol1,num,lineno,fp1);
printf("\n");
}
}
//printf("%d",min(4,3));
//printf("%d",compare(keywords[1],keywords[1]));
/*
for(int i=0;i<32;i++)
printf("%s ",keywords[i]);
*/
/*
for(int i=0;i<5;i++)
printf("%c",symbol[i]);
*/
//结尾
fclose(fp);
return 1;
}
/*
//isaletter的测试
for(i=0;i<num;i++)
{
bool a=isaletter(buf[i]);
if(a) printf("%c is a letter\n",buf[i]);
else printf("%c is not a letter\n",buf[i]);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -