📄 新建 文本文档.txt
字号:
#include<string.h>
#include<stdio.h>
#include<fstream.h>
#include<ctype.h>
#include<iostream.h>
#include <stdio.h>
#define MAX 18//分析表的最大容量
#define MAXBUF 255
char ch =' ';// 存放读入当前的输入字符
int lineno;
struct reserve
{
char lexptr[MAXBUF];
int token;
};
struct reserve symtable[MAX];
char * str[]={"iostream","cin","cout","void","main","include",
"endl","char","int","real","for","to","if","then","else","do","while","iostream.h"};
//对符号表进行初始化
void init()
{
int j=0;
for( j=0; j<18; )
{
strcpy(symtable[j].lexptr,str[j]);
symtable[j].token=j+3;
j++;
}
}
int number(char ch)
{
return (ch>='0'&&ch<='9');
}//判断是否为数字
int letter(char ch)
{
return (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch=='.');
}//判断是否为字母
int search(char *temp)
{
for(int i=0; i<sizeof(symtable)/sizeof(symtable[0]); i++)
{
if(!strcmp(symtable[i].lexptr ,temp))
{
return symtable[i].token;
}
}
return 0;
}
//分析程序
void analyse(FILE *fpin,FILE *fpout)
{
//char *arr;
char arr[MAXBUF];
int i=0;
int j=0;
//读入字符判断,空格、字母、数字、界符
while((ch=fgetc(fpin))!=EOF)
{
if(ch==' '||ch=='\t')
{
}
else if(ch=='\n')
{
lineno++;
}
else if(number(ch))
{
/////////读入数字
while(number(ch))
{
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
arr[j]='\0';
j=0;
fseek(fpin,-1L,SEEK_CUR);
fprintf(fpout,"%s\n",strcat(arr,"数字")) ;
}
else if (letter(ch))
{
while(letter(ch)||number(ch))
{
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
arr[j]='\0';
j=0;
if (search(arr))
{
fprintf(fpout,"%s\n",strcat(arr," 关键字"));
///string b("关键字");
///string a =arr+b;
//PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fpout)));
//out.println(a);
//fpout<<arr<< "Reserve Word" << endl;
///fprintf(fpout,"%s\n",arr," 关键字");
}
else
fprintf(fpout,"%s\n",strcat(arr," 标识符"));
//fprintf(fpout,"%s\n",arr," 标识符");
}
else if(ch==':')
{
ch=fgetc(fpin);
if(ch=='=')
{
fprintf(fpout,"%s\n",":="" 特殊符号");
}
else
{
fprintf(fpout,"%s\n",":" " 特殊符号");
fseek(fpin,-1L,SEEK_CUR);
}
}
else if (ch=='>')
{
ch=fgetc(fpin);
if(ch=='=')
{
fprintf(fpout,"%s\n",">=" " 特殊符号");
}
else
{
fprintf(fpout,"%s\n",">" " 特殊符号");
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='<')
{
ch=fgetc(fpin);
if(ch=='>')
{
fprintf(fpout,"%s\n","<>"" 特殊符号");
}
else if(ch=='=')
{
fprintf(fpout,"%s\n","<="" 特殊符号");
}
else
{
fprintf(fpout,"%s\n", "<"" 特殊符号");
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='/')
{
ch=fgetc(fpin);
if(ch=='*')
{
ch=fgetc(fpin);
s: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\n","/"" 特殊符号");
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='+')
{
fprintf(fpout,"%s\n","+"" 特殊符号");
}
else if(ch=='-')
{
fprintf(fpout,"%s\n","-"" 特殊符号");
}
else if(ch=='*')
{
fprintf(fpout,"%s\n","*"" 特殊符号");
}
else if(ch=='(')
{
fprintf(fpout,"%s\n","("" 特殊符号");
}
else if(ch==')')
{
fprintf(fpout,"%s\n",")"" 特殊符号");
}
else if(ch=='[')
{
fprintf(fpout,"%s\n","["" 特殊符号");
}
else if(ch==']')
{
fprintf(fpout,"%s\n","]"" 特殊符号");
}
//else if(ch=='.')
//{
//fprintf(fpout,"%s\n",".","特殊符号");
//}
else if(ch==';')
{
fprintf(fpout,"%s\n",";"" 特殊符号");
}
else if(ch=='=')
{
fprintf(fpout,"%s\n","="" 特殊符号");
}
else if(ch==',')
{
fprintf(fpout,"%s\n",","" 特殊符号");
}
else if(ch=='#')
{
fprintf(fpout,"%s\n","#"" 特殊符号");
}
else if(ch=='{')
{
fprintf(fpout,"%s\n","{"" 特殊符号");
}
else if(ch=='}')
{
fprintf(fpout,"%s\n","}"" 特殊符号");
}
else fprintf(fpout,"error in unknow character %c\n",ch) ;
}
}
void main()
{
char filenamein[30];
char filenameout[30];
printf(" 这是一个小型的词法分析器\n\n");
printf("请输入源文件的文件名( length<30 )\n");
scanf("%s",filenamein);
char ch;
FILE* fpin=fopen(filenamein,"r");
printf("\n请输入要保存词法分析后结果的文件名( length<30 )\n");
scanf("%s",filenameout);
FILE* fpout=fopen(filenameout,"w");
init();
analyse(fpin,fpout);
fclose(fpout);
fclose(fpin);
cout<<endl<<"词法分析的结果已写入到文件"<<filenameout<<endl;
int f;
cout<<endl<<"要查看词法分析后的结果请输入 1,否则按任意其他键"<<endl;
cin>>f;
if(f==1)
{
FILE* fpin1=fopen(filenameout,"r");
cout<<"经过词法分析后为:"<<endl;
ch = getc( fpin1);
while( ch != EOF )
{
printf( "%c", ch );
ch = getc( fpin1);
}
fclose(fpin1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -