📄 by1.cpp
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define BEGIN 1
#define END 2
#define IF 3
#define THEN 4
#define ELSE 5
#define FOR 6
#define DO 7
#define WHILE 8
#define AND 9
#define OR 10
#define NOT 11
#define ID 12
#define INT 13
#define PLUS 14 //+
#define MINUS 15 //-
#define MULT 16 //*
#define FEN 17 //;
#define LK 18 //(
#define RK 19 //)
#define LT 20 //<
#define LE 21 //<=
#define EQ 22 //=
#define NE 23 //<>
#define GT 24 //>
#define GE 25 //>=
#define MH 26 //:
#define FZ 27 //:=
#define XIE 28 ///
#define ZHX 29 ///*
char token[30];
int exp_flag=0;
FILE *fpwr;
int lookup(char *pt){
int i,j;
int flag=0;
char low[6];
//字符串数组
char str[11][6]={{"begin"},{"end"},{"if"},{"then"},{"else"},{"for"},{"do"},{"while"},{"and"},{"or"},{"not"}};
for(j=0;j<5;j++){
low[j]=tolower(*(pt+j));
}
low[j]='\0'; //对前五个字符进行小写处理
for(i=0;i<11;i++){
if(strcmp(low,str[i])==0)
flag=i+1;
}
return flag;
}
void out(int bianma,char *ptoken){
if(exp_flag==0){
fputc('(',fpwr);
fprintf(fpwr,"%d,%s",bianma,ptoken);
fputc(')',fpwr);
}
}
void scanner_ex(FILE *fp){
char ch;
char cht;
int i,c;
ch=fgetc(fp);
while(ch!='#'){
if(isalpha(ch)) //字母
{
token[0]=ch;
ch=fgetc(fp);
i=1;
while(isalnum(ch)) //字母或数字
{token[i]=ch; i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1); //retract
c=lookup(token); //lookup
if(c==0) //没查到
out(ID,token);
else out(c," "); //已查到
}
else if(isdigit(ch))
{
token[0]=ch;
ch=fgetc(fp);
i=1;
while(isdigit(ch))
{
token[i]=ch; i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1); //retract
out(INT,token);
}
else
switch(ch)
{
case'<': ch=fgetc(fp);
if(ch=='=')
out(LE," ");
else if(ch=='>')
out(NE," ");
else
{fseek(fp,-1,1);
out(LT," ");
}
break;
case'=':out(EQ," ");
break;
case'>':ch=fgetc(fp);
if(ch=='=')
out(GE," ");
else
{fseek(fp,-1,1);
out(GT," ");
}
break;
case':':ch=fgetc(fp);
if(ch=='=')
out(FZ," ");
else
{fseek(fp,-1,1);
out(MH," ");
}
break;
case'/':ch=fgetc(fp);
if(ch=='*')
exp_flag=1;
else
{fseek(fp,-1,1);
out(XIE," ");
}
break;
case'+':out(PLUS," ");
break;
case'-':out(MINUS," ");
break;
case'*':
out(MULT," ");
if(exp_flag==1){
cht=fgetc(fp);
if(cht=='/')
exp_flag=0;}
break;
case';':out(FEN," ");
break;
case'(':out(LK," ");
break;
case')':out(RK," ");
break;
// default: report_error();
// break;
}//switch
ch=fgetc(fp);
}//while
}
void main(){
FILE *fpt;
if((fpt=fopen("test.txt","r"))==NULL)
printf("cannot open file\n");
else{
if((fpwr=fopen("write.txt","w"))==NULL)
printf("cannot open file write\n");
else
scanner_ex(fpt);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -