📄 scanner.cpp
字号:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdarg.h>
#include<math.h>
#define MAXBUF 20
#define MAX 300
char arr[100];//识别字的缓冲数组
char ch;
int string_char_num=0,error_num=0;
struct token
{
char keyword[MAXBUF];
int tokennum;
};
//关键字结构
struct token keywords[MAX]=
{
{"and",1},{"array",2},{"begin",3},{"bool",4},{"call",5},{"case",6},
{"char",7},{"constant",8},{"do",9},{"else",10},{"end",11},{"false",12},
{"for",13},{"if",14},{"input",15},{"integer",16},{"not",17},{"of",18},
{"or",19},{"output",20},{"proceduce",21},{"program",22},{"read",23},{"real",24},
{"repeat",25},{"set",26},{"then",27},{"to",28},{"true",29},{"until",30},
{"var",31},{"while",32},{"write",33},{"stringsign",34},{"intnum",35},{"trunum",36},
{"charnum",37},{"'",38},{"(",39},{")",40},{"*",41},{"*/",42},
{"+",43},{",",44},{"-",45},{".",46},{"..",47},{"/",48},
{"/*",49},{":",50},{":=",51},{";",52},{"<",53},{"<=",54},
{"<>",55},{"=",56},{">",57},{">=",58},{"[",59},{"]",60},
};
//判断给的字符串是否在字符号表中
int judgekeyword(const char *keywordstring)
{
int loop;
for(loop=0;loop<=32;loop++)
{
if(strcmp(keywords[loop].keyword,keywordstring)==0)
return keywords[loop].tokennum;
}
return 0;
}
//字符变量打印
void outprintchar(int tokenno)
{
FILE *fpout;
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%c)\n",tokenno,ch) ;
fclose(fpout);
string_char_num++;
return;
}
//字符串变量和关键字打印
void outprintstring(int tokenno)
{
FILE *fpout;
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",tokenno,arr) ;
fclose(fpout);
string_char_num++;
return;
}
//错误报告打印
void outprinterror(int lineno,int lieno)
{
FILE *fpout;
int i;
i=strlen(arr);
if(i==1)
{
fpout=fopen("error.txt","a");
fprintf(fpout,"无法识别的字符 %s\t error \t%d\t%d \n",arr,lineno,lieno);
fclose(fpout);
}
else
{
fpout=fopen("error.txt","a");
fprintf(fpout,"变量错误 \t%s\t error \t%d\t%d \n",arr,lineno,lieno);
fclose(fpout);
}
error_num++;
return;
}
//行列值打印
void outprintline(int lineno,int lieno)
{
FILE *fpout;
fpout=fopen("line.txt","a");
fprintf(fpout,"%d\t%d\n",lineno,lieno);
fclose(fpout);
return;
}
//扫瞄器主体部分
void scanner()
{
FILE *fpin, *fpout;
// char infilename[20],outfilename[20];
int lineno=1,lieno=1;
/* printf("\nthe input file name:");
scanf("%s",infilename);
printf("\nthe output file name:");
scanf("%s",outfilename);
*/
if((fpin=fopen("program.txt","r"))==NULL)
{
printf("cannot open file");
return;
}
int j=0;
fpout=fopen("token.txt","w"); //将文件清空
fclose(fpout);
fpout=fopen("error.txt","w"); //将文件清空
fclose(fpout);
fpout=fopen("line.txt","w"); //将文件清空
fclose(fpout);
while((ch=fgetc(fpin))!=EOF) //读入字符判断,空格、字母、数字、界符
{
if(ch==' '||ch=='\t')
{
;
}
else if(ch=='\n') //如果是换行符,则行号加1,列号为初值1
{
lineno++;
lieno=1;
}
else if(isdigit(ch)) //如果是数字
{
arr[j++]=ch;
ch=fgetc(fpin);
while(isdigit(ch)) //判断和读取数字
{
arr[j++]=ch;
ch=fgetc(fpin);
}
if(ch=='.')
{
arr[j++]=ch;
ch=fgetc(fpin);
if(isalpha(ch)||ch=='_')
goto error;
if(isdigit(ch))
{
while(isdigit(ch))
{
arr[j++]=ch;
ch=fgetc(fpin);
}
error: if(isalpha(ch)||ch=='_')
{
arr[j++]=ch;
ch=fgetc(fpin);
while(isalpha(ch)||ch=='_'||isdigit(ch))
{
arr[j++]=ch;
ch=fgetc(fpin);
}
arr[j]='\0';
fseek(fpin,-1L,SEEK_CUR);
outprinterror(lineno,lieno);
outprintline(lineno,lieno);
lieno=lieno+j;
j=0;
}
else
{
arr[j]='\0';
fseek(fpin,-1L,SEEK_CUR);
outprintstring(36);
outprintline(lineno,lieno);
lieno=lieno+j;
j=0;
}
}
}
else if(isalpha(ch)||ch=='_')//是字母或是_
{
arr[j++]=ch;
ch=fgetc(fpin);
while(isalpha(ch)||(ch=='_')||isdigit(ch))
{
arr[j++]=ch;
ch=fgetc(fpin);
}
arr[j]='\0';
fseek(fpin,-1L,SEEK_CUR);
outprinterror(lineno,lieno);
outprintline(lineno,lieno);
lieno=lieno+j;
j=0;
}
else
{
arr[j]='\0';
fseek(fpin,-1L,SEEK_CUR);
outprintstring(35);
outprintline(lineno,lieno);
lieno=lieno+j;
j=0;
}
}
else if (isalpha(ch)) //如果是字母
{
arr[j++]=ch;
ch=fgetc(fpin);
while(isalpha(ch)||isdigit(ch)||ch=='_')
{
arr[j++]=ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
arr[j]='\0';
if (judgekeyword(arr)) //如果是关键字
{
outprintstring(judgekeyword(arr));
outprintline(lineno,lieno);
}
else //普通标志符
{
outprintstring(34);
outprintline(lineno,lieno);
}
lieno=lieno+j;
j=0;
}
else if(ch=='\'')
{
outprintchar(38);
outprintline(lineno,lieno);
lieno++;
}
else if(ch=='(')
{
outprintchar(39);
outprintline(lineno,lieno);
lieno++;
}
else if(ch==')')
{
outprintchar(40);
outprintline(lineno,lieno);
lieno++;
}
else if(ch=='*')
{
outprintchar(41);
outprintline(lineno,lieno);
lieno++;
}
else if(ch=='+')
{
outprintchar(43);
outprintline(lineno,lieno);
lieno++;
}
else if(ch==',')
{
outprintchar(44);
outprintline(lineno,lieno);
lieno++;
}
else if(ch=='-')
{
outprintchar(45);
outprintline(lineno,lieno);
lieno++;
}
else if(ch=='.')
{
ch=fgetc(fpin);
if(ch=='.')
{
lieno++;
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",47,"..");
fclose(fpout);
outprintline(lineno,lieno);
lieno++;
string_char_num++;
}
else
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",46,".");
fclose(fpout);
outprintline(lineno,lieno);
lieno++;
string_char_num++;
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='/')
{
ch=fgetc(fpin);
if(ch=='*')
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",49,"/*");
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
ch=fgetc(fpin);
exple:
while(ch!='*')
{
lieno++;
if(ch=='\n')
{
lineno++;
lieno=0;
}
ch=fgetc(fpin);
}
if(ch=='*')
{
lieno++;
ch=fgetc(fpin);
while(ch!='/')
{
goto exple; //如果是注释 /* */
}
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",42,"*/");
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
// fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='/')
{
ch=fgetc(fpin);
while(ch!='\n')
{
ch=fgetc(fpin); //如果是注释 //
}
lineno++;
lieno=1;
}
else
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",48,"/");
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch==':')
{
ch=fgetc(fpin);
if(ch=='=')
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",51,":=");
fclose(fpout); //如果是 :=
outprintline(lineno,lieno);
lieno+=2;
string_char_num++;
}
else
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",50,":"); //如果是 :
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch==';')
{
outprintchar(52);
outprintline(lineno,lieno);
lieno++;
}
else if(ch=='<')
{
ch=fgetc(fpin);
if(ch=='>')
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",55,"<>"); // 如果是 <>
fclose(fpout);
outprintline(lineno,lieno);
lieno+=2;
string_char_num++;
}
else if(ch=='=')
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",54,"<="); //如果是 <=
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
}
else
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",53,"<"); //如果是 <
fclose(fpout);
outprintline(lineno,lieno);
lieno++;
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='=')
{
lieno++;
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",56,"=");
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
}
else if (ch=='>')
{
ch=fgetc(fpin);
if(ch=='=') //如果是 >=
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",58,">=");
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
}
else
{
fpout=fopen("token.txt","a");
fprintf(fpout,"(%d,%s)\n",57,">"); //如果是 >
fclose(fpout);
string_char_num++;
outprintline(lineno,lieno);
lieno++;
fseek(fpin,-1L,SEEK_CUR);
}
}
else if(ch=='[')
{
lieno++;
outprintchar(59);
outprintline(lineno,lieno);
}
else if(ch==']')
{
lieno++;
outprintchar(60);
}
else
{
arr[j++]=ch;
arr[j]='\0';
j=0;
outprinterror(lineno,lieno);
outprintline(lineno,lieno);
lieno++;
}
}
fclose(fpin);
}
//主函数
void main()
{
scanner(); /*扫描源程序*/
FILE *fpout;
fpout=fopen("line.txt","a");
fprintf(fpout,"总共:\t%d\n正确:\t%d\n错误:\t%d\n",string_char_num,(string_char_num-error_num),error_num);
fclose(fpout);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -