📄 cifafenxi.c
字号:
/* ==================================================================*/
/*~~~~~~~~~~~先鄙视下那些不排队检查作业的人们~~~~~~~~~~~~~~~~~~~~~~~~*/
/*实现的功能:
1:注释部分和空白的排出,并实现输出的注释部分的功能~
2:关键字写外部的文件里,可以不用修改程序就可以
添加关键字~
3:简单的错误判断,比如***的表示~
4:文件的输出out.txt,能输出助记符,种别编码,行号和代码内容~
5:错误的内容输出,对与检查出来的错误,输出为error.txt,其中
包括了错误所在的行,及错误类型信息~
6: 符号表和常量表各自输出在fuhao.txt和clb.txt~ */
/*~~~~~~~~~~再次鄙视下那些不排队检查作业的人们~~~~~~~~~~~~~~~~~~~~~~~*/
/*===================================================================*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int hang=1; /* 用来输出所在的行 */
/* /* ////////////////////////////////////////////////////////////////////// */ */
/* 下滑线判断 */
int xiahuaxian_(char ch)
{
if(ch=='_') return 1 ;
return 0;
}
/* /////////////////////////////////////////////////////////////////////////// */
/* 字母判断 */
int Pha(char ch)
{
if(isalpha(ch)) return 1;
return 0;
}
/* /////////////////////////////////////////////////////////////////////////// */
/* 数字判断 */
int Num(char ch)
{
if(isalnum(ch)) return 1;
return 0;
}
/* /////////////////////////////////////////////////////////////////////////// */
/* 空格判断 */
int Space(char ch)
{
if(ch==' ') return 1;
return 0;
}
/* ////////////////////////////////////////////////////////////////////////// */
/* 读取下个字符 */
void GetAChar(FILE *fp,char *ch)
{
*ch = fgetc(fp);
if(*ch=='\n')
{ hang++;
/* printf("第%d行内容: \n",hang); */
}
}
/* /////////////////////////////////////////////////////////////////////////// */
/* 再次定义读取下一个字符是为了统计行准确 */
void GetBChar(FILE *fp,char *ch)
{
*ch = fgetc(fp);
/* printf("第%d行内容: \n",hang); */
}
/* //////////////////////////////////////////////////////////////////////// */
/* 读取第一个不为零的字符 */
void Get_Space(FILE *fp,char *ch)
{
do
{
GetAChar(fp,ch);
}
while(Space(*ch)&&(*ch!= EOF));
}
/* //////////////////////////////////////////////////////////////////////// */
/* 返回上个字符的指针,并置ch为空 */
void Return_A(FILE *fp,char *ch)
{
fseek(fp,-1,1);
*ch='';
}
/* /////////////////////////////////////////////////////////////////////// */
/* 把读到的字符连到一起 */
void Join(char *string, char *ch)
{
int i;
for(i=0;i<80;i++)
{
if(*string == NULL)
{
*string = *ch;
break;
}
string++;
}
}
/* /////////////////////////////////////////////////////////////////////////// */
/* 词法分析程序 */
int cifafenxi(FILE *fp1,FILE *fp2,FILE *fp6,FILE *fp3,FILE *fp5)
{
FILE *fp4;
char ch;
char ch1;
int code;
int i,j,k,h;
char string[100];
char string1[50] ;
fprintf(fp2,"输出的格式为:<--$助记符,种别编码,行号,代码-->\n");
/* Get_Space(fp4,&ch1);
while(ch1!=EOF)
{ printf("%c",ch1);GetAChar(fp4,&ch1);getch();} */
while(1)
{ if((fp4=fopen("guanjz.txt","rt"))==NULL)
{
printf("guanjz.txt不能打开~\n");
getch();
exit(1);
}
Get_Space(fp1,&ch);
k=0;h=1;
/* printf("%c",ch);
getch();*/
for(i=0;i<100;i++)
string[i]=NULL;
if(ch==EOF)
{
printf("词法分析结束,保存文件为out.txt,按任意键结束~");
getch();
return 0;
}
if (Pha(ch))
{
while (Pha(ch) ||Num(ch)||xiahuaxian_(ch))
{
Join(string,&ch);
GetAChar(fp1,&ch);
}
if(ch==EOF)
{
printf("词法分析结束,保存文件为out.txt,按任意键结束~");
getch();
return 0;
}
Return_A(fp1,&ch);
/* ===============关键字的查询和输出============================ */
while(h==1)
{ for(j=0;j<50;j++)
string1[j]=NULL;
Get_Space(fp4,&ch1);
/* printf("%c",ch1);
getch();
fclose(fp4);
GetAChar(fp4,&ch1);
printf("%c",ch1);
getch();*/
if(ch1==EOF)
{ if(k==0)
{ printf("<--$ID,6,%d,%s-->\n",hang,string);
fprintf(fp2,"<--$ID,6,%d,%s-->\n",hang,string);
fprintf(fp5,"<--%d,%s-->\n",hang,string);
k=0;
}
h=0;
}
while((!Pha(ch1))&&ch1!=EOF)
{ GetBChar(fp4,&ch1);
/* printf("%c",ch1);
getch();*/
}
while (Pha(ch1))
{
Join(string1,&ch1);
GetBChar(fp4,&ch1);
}
/* printf("%s ",string);
printf("%s\n",string1);getch();*/
if(strcmp(string,string1) == 0)
{ k=1; h=0;
printf("<--$%s,",string);
fprintf(fp2,"<--$%s,",string);
GetBChar(fp4,&ch1);
for(j=0;j<50;j++)
string1[j]=NULL;
while(!Num(ch1)&&ch1!=EOF)
{ GetBChar(fp4,&ch1);
}
while(Num(ch1))
{ Join(string1,&ch1);
GetBChar(fp4,&ch1);
}
printf("%s,%d,%s-->\n",string1,hang,string);
fprintf(fp2,"%s,%d,%s-->\n",string1,hang,string);
}
/* else
{
GetBChar(fp4,&ch1);
while(!Pha(ch1)&&ch1!=EOF)
{ GetBChar(fp4,&ch1);
}
}
fclose(fp4) ;*/
}
}/* if结束 */
/* ===========关键字查询输出完成======================== */
/* printf("%d",code); */
/* getch(); */
/* 常量判断 */
else if (Num(ch))
{
while (Num(ch))
{
Join(string,&ch);
GetAChar(fp1,&ch);
}
if(ch==EOF)
{
printf("词法分析结束,保存文件为out.txt,按任意键结束~");
getch();
return 0;
}
Return_A(fp1,&ch);
code=77;
printf("<--$INT,%d,%d,%s-->\n",code,hang,string);
fprintf(fp2,"<--$INT,%d,%d,%s-->\n",code,hang,string);
}
else if (ch == '=')
{ /* “=”号判断 */
code=51;
printf("<--$ASSIGN,%d,%d,%c-->\n",code,hang,ch);
fprintf(fp2,"<--$ASSIGN,%d,%d,%c-->\n",code,hang,ch);
fprintf(fp6,"<--%d,%c-->\n",hang,ch);
}
else if (ch == '+')
{ /* “+“号判断 */
code=52;
printf("<--$PLUS,%d,%d,%c-->\n",code,hang,ch);
fprintf(fp2,"<--$ASSIGN,%d,%d,%c-->\n",code,hang,ch);
fprintf(fp6,"<--%d,%c-->\n",hang,ch);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -