📄 word.h
字号:
//#include"Syntax.h"
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<iomanip.h>
#include<stdlib.h>
#include<process.h>
#define NULL 0
#define REC_INIT_SIZE 1
#define INCREMENT 1
#define ANT_INIT_SIZE 5
#define ANT_INCREMENT 5
struct Kw
{
char key[10];
int keyv;
};
Kw ke[33]={{"program",3},
{"var",4},
{"procedure",5},
{"begin",6},
{"end",7},
{"if",8},
{"then",9},
{"else",10},
{"while",11},
{"do",12},
{"call",13},
{"integer",14},
{"real",15},
{"+",16}, {"-",17},{"*",18},{"/",19},
{"~",20}, {"&",21},{"|",22},{"<",23},
{"<=",24},{">",25},{">=",26},{"=",27},
{"<>",28},{":=",29},{";",30},{".",31},
{",",32},{"(",33},{")",34},{":",35} };
struct Rec
{
char idname[10];
int idaddr;
};
struct Ant
{
int kind;
int num;
char word[10];
int row;
};
Rec * r=(Rec*)malloc(REC_INIT_SIZE*sizeof(Rec));
Ant * an=(Ant*)malloc(ANT_INIT_SIZE*sizeof(Ant));
static int n=0;
static int m=1;
int length=REC_INIT_SIZE;
int Ant_length=ANT_INIT_SIZE,Ant_num=0;
int rem=0;
char buf[100];
char token[10];
char* frp,*frp1;
int rrow=0;
void Read()
{
int t=0,t1=0;
for(;*frp!=NULL;frp++)
{
if(*frp==' '||*frp=='\t')
{
frp--;
if(*frp==' '||t==0||*frp=='\t')
{frp++;continue;}
else
{
frp++;
break;
}
}
frp1=(frp-1);
if( (*frp>='a'&&*frp<='z')||(*frp>='A'&&*frp<='Z')||(*frp>='0'&&*frp<='9')
||(*frp1>='0'&&*frp1<='9'&&*frp=='.'))
{
if(t1==1)
break;
else
{
if(t<10)
token[t]=*frp;
}
}
else
{
if(t1==0&&t!=0)
break;
else
token[t]=*frp;
t1=1;
if( (t==0)&&(token[t]=='<'||token[t]=='>'||token[t]==':'||token[t]=='/'||token[t]=='*'||token[t]=='~'))
{
frp++;
if((*frp=='=')||(token[t]=='<'&&*frp=='>')||(token[t]=='/'&&(*frp=='*'||*frp=='/')))
{
t++;
token[t]=*frp;
frp++;
if(strcmp("/*",token)==0)
rem=1;
break;
}
else
break;
}
else
{
frp++;
break;
}
}
t++;
}
}
bool identifier(char * s)
{
int x;
char s1[11];
strcpy(s1,s);
strlwr(s);
for(int i=0;i<=33;i++)
{
x=strcmp(s,ke[i].key);
if(x==0)
{
if(Ant_num>=Ant_length)
{
Ant_length+=ANT_INCREMENT;
Ant *an1=(Ant*)realloc(an,Ant_length*sizeof(Ant));
an=an1;
}
an[Ant_num].kind=ke[i].keyv;
an[Ant_num].num=0;
an[Ant_num].row=rrow;
strcpy(an[Ant_num].word,s1);
Ant_num++;
//cout<<setiosflags(ios::left)<<"("<<ke[i].keyv<<",0)"<<setw(11)<<s1;
strcpy(s,s1);
return true;
}
}
strcpy(s,s1);
return false;
}
bool IsRecode(char * s)
{
if((*s>='a'&&*s<='z')||(*s>='A'&&*s<='Z'))
{
for(int i=0;i<n;i++)
{
if(strcmp(s,r[i].idname)==0)
{
if(Ant_num>=Ant_length)
{
Ant_length+=ANT_INCREMENT;
Ant *an1=(Ant*)realloc(an,Ant_length*sizeof(Ant));
an=an1;
}
an[Ant_num].kind=1;
an[Ant_num].num=r[i].idaddr;
an[Ant_num].row=rrow;
strcpy(an[Ant_num].word,s);
Ant_num++;
//cout<<setiosflags(ios::left)<<"(1,"<<r[i].idaddr<<")"<<setw(11)<<r[i].idname;
return true;
}
}
if(n>=length)
{
length+=INCREMENT;
Rec *r1=(Rec*)realloc(r,length*sizeof(Rec));
r=r1;
}
if(Ant_num>=Ant_length)
{
Ant_length+=ANT_INCREMENT;
Ant *an1=(Ant*)realloc(an,Ant_length*sizeof(Ant));
an=an1;
}
an[Ant_num].kind=1;
an[Ant_num].num=m;
an[Ant_num].row=rrow;
strcpy(an[Ant_num].word,s);
Ant_num++;
r[n].idaddr=m;
//cout<<setiosflags(ios::left)<<"(1,"<<r[n].idaddr<<")";
strcpy(r[n].idname,s);
//cout<<setw(11)<<r[n].idname;
n++;
m++;
return true;
}
if(*s>='0'&&*s<='9')
{
int dian=0;
char *s1=s;
for(++s1;*s1!=NULL;s1++)
{
if(*s1>='0'&&*s1<='9'||*s1=='.')
{
if(dian==1&&*s1=='.')
{cout<<an[Ant_num-1].row<<":????????!!"<<endl;exit(0);}
if(*s1=='.')
dian=1;
continue;
}
else
break;
}
if(Ant_num>=Ant_length)
{
Ant_length+=ANT_INCREMENT;
Ant *an1=(Ant*)realloc(an,Ant_length*sizeof(Ant));
an=an1;
}
an[Ant_num].kind=2;
an[Ant_num].num=dian+1;
an[Ant_num].row=rrow;
strcpy(an[Ant_num].word,s);
Ant_num++;
if(*s1!=NULL)
{
cout<<rrow<<":????!"<<endl;;
exit(0);
}
return true;
}
return false;
}
void Word()
{
fstream file;
file.open("input3.txt",ios::in);
while(!file.eof() )
{
bool b1,b2;
file.getline(buf,100);
frp=buf;
rrow++;
lable: while(*frp!=NULL)
{
Read();
if(strcmp(token,"//")==0)
{
for(int i=0;token[i]!='\0';i++)
token[i]='\0';
break;
}
if(rem==1)
{
for(int i=0;token[i]!='\0';i++)
token[i]='\0';
while(*frp!=NULL)
{
if(*frp=='*'&&*(++frp)=='/')
{
rem=0;
frp++;
goto lable;
}
frp++;
}
break;
}
b1=identifier(token);
if(b1==false)
{
b2=IsRecode(token);
if(b2==false)
{
if(*frp!=NULL)
{
cout<<rrow<<":?????"<<endl;
exit(0);}
}
}
//if(t==4)
// {
// cout<<endl;
// t=0;
// }
// t++;
for(int i=0;token[i]!='\0';i++)
token[i]='\0';
}
}
an[Ant_num].kind=0;
an[Ant_num].num=0;
an[Ant_num].row=0;
strcpy(an[Ant_num].word,"f");
Ant_num++;
// an[Ant_num].kind=0;
// an[Ant_num].num=0;
// for(int j=0;j<Ant_num;j++)
// cout<<"("<<an[j].kind<<","<<an[j].num<<", "<<an[j].row<<","<<an[j].word<<")"<<endl;
file.close();
// cout<<endl<<"????:"<<endl;
// cout<<setw(12)<<"??"<<setw(12)<<"??"<<setw(10)<<"??"<<endl;
// for(int i=0;i<n;i++)
// cout<<setiosflags(ios::left)<<setw(12)<<r[i].idaddr<<setw(12)<<r[i].idname<<setw(10)<<&r[i]<<endl;
file.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -