📄 parse.c
字号:
/* 词法分析程序*/
/*作者:FayUo*/
/*程序名:parse.exe*/
/* 判断函数 IsDigit(char)是数字; IsLetter(char)是字母开头的; FindKeyWords(array)搜索关键字表,返回类型码; parse(FILE *fpin,FILE *fpout)词法分析主程序*/
/*BackSpace(FILE *fp,char *ch) 退格,并且使得ch为空*/
/*编译通过后在命令行下输入: parse [yourname.txt] 否则程序认为没有输入文件而退出.输出文件为C根目录下output.txt*/
#include "stdio.h"
#define MAX 255
#define TRUE 1
#define FALSE 0
int IsDigit(char ch)
{
if(ch>='0'&&ch<='9')
return TRUE;
else
return FALSE;
}
int IsLetter(char ch)
{
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
return TRUE;
else
return FALSE;
}
BackSpace(FILE *fp,char ch)
{
fseek(fp,-1L,1);
ch='';
}
Cleararray(char *arr)
{
int i=0;
for(i=0;i<=MAX;i++)
arr[i]='\0';
}
char FindKeyWords(char *arr)
{
if(strcmp(arr,"while")==0)
return '1';
if(strcmp(arr,"if")==0)
return '2';
if(strcmp(arr,"else")==0)
return '3';
if(strcmp(arr,"switch")==0)
return '4';
if(strcmp(arr,"case")==0)
return '5';
else
return '6';
}
int parse(FILE *fpin,FILE *fpout)
{
char ch,arr[MAX],token;
int i=0;
while(1)
{
ch=fgetc(fpin);
if(ch==EOF) break;
else if(IsDigit(ch))
{
while(IsDigit(ch))
{
arr[i++]=ch;
ch=fgetc(fpin);
}
arr[i+1]='\0';
BackSpace(fpin,ch);
{
fprintf(fpout,"(%d,%s)|",7,arr);
}
Cleararray(arr);
i=0;
}
else if(IsLetter(ch))
{
while(IsLetter(ch)||IsDigit(ch))
{
arr[i++]=ch;
ch=fgetc(fpin);
}
arr[i+1]='\0';
printf("++++");
BackSpace(fpin,ch);
token=FindKeyWords(arr);
printf("****");
if(token=='1')
{
fprintf(fpout,"(%c, )|",token);
Cleararray(arr);
i=0;
}
if(token=='2')
{
fprintf(fpout,"(%c, )|",token);
Cleararray(arr);
i=0;
}
if(token=='3')
{
fprintf(fpout,"(%c, )|",token);
Cleararray(arr);
i=0;
}
if(token=='4')
{
fprintf(fpout,"(%c, )|",token);
Cleararray(arr);
i=0;
}
if(token=='5')
{
fprintf(fpout,"(%c, )|",token);
Cleararray(arr);
i=0;
}
if(token=='6') {
fprintf(fpout,"(%c,%s)|",token,arr);
Cleararray(arr);
i=0;
}
}
else if(ch=='+')
fprintf(fpout,"%c%d,%c%c|",'(',8,' ',')');
else if(ch=='-')
fprintf(fpout,"%c%d,%c%c|",'(',9,' ',')');
else if(ch=='*')
fprintf(fpout,"%c%d,%c%c|",'(',10,' ',')');
else if(ch=='<')
{
ch=fgetc(fpin);
if(ch=='=')
fprintf(fpout,"%c%d,%s%c|",'(',11,"LE",')');
else
{fprintf(fpout,"(%d,LT)|",11); BackSpace(fpin,ch);}
}
else if(ch=='=')
{
ch=fgetc(fpin);
if(ch=='=')
fprintf(fpout,"%c%d,%c%c|",'(',11,"EQ",')');
else
{fprintf(fpout,"(%d, )|",12); BackSpace(fpin,ch);}
}
else if(ch==';')
fprintf(fpout,"%c%d,%c%c|",'(',13,' ',')');
else if(ch=='#')
fclose(fpout);
}
}
void main(int argc,char *argv[])
{
FILE *fpin,*fpout;
if(argc==1)
{
printf("You did not open any file, Please press any key to exit");
getch();
exit(0);/*正常退出*/
}
if((fpin=fopen(argv[1],"r"))==NULL)
{
printf("cannot open this file,press any key to exit\n");
getch();
exit(1);/*异常退出*/
}
if((fpout=fopen("c:\\output.txt","w"))==NULL)
{
printf("cannot creat %s,please press anykey to exit\n");
getch();
exit(1);/*异常退出*/
}
printf("Let's go~\n");
parse(fpin,fpout);
fclose(fpin);
fclose(fpout);
printf("OK!! @^_^@");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -