📄 scanner.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<math.h>
#include<ctype.h>
#define OK 1
#define ERROR -1
//#define NULL 0
char Word[80]; //用于存放标志符或关键字
char ch; //用于存放一个字符
char Buffer[1000]; //定义数据缓冲区
char *Headp,*Tail; //指向字符串表的头尾指针
char String[500]; //字符串表
int Num[80]; //用于存放数字常数
int row=0,column=0; //行记数,列记数
int idlen=0,numlen=0; //表示字符的长度,数字的长度
int kind; //标记
int ENTRY; //入口地址
int c=0; //标记符号表的长度
int c1=1; //标记字符串表的长度
int n=4096;
float num1=0;
bool T=true; //用于标记整个程序是否出错
FILE *fp1,*fp2,*fp3,*fp4,*fp5;
struct signtable //定义符号表的数据结构
{
char *head;
int len;
char type[4];
char kind[4];
float val;
char *addr;
}Tab[500];
struct token
{
int code;
int addr;
}token;
struct Simpcode
{//用结构体数组存放关键字
int kindcode;//关键字种别码
char word[10];//关键字自身值
}Simple[33];
//初始化
void unit(){
int i,j;
Simple[0].kindcode=1;
Simple[0].word[0]='a';
Simple[0].word[1]='n';
Simple[0].word[2]='d';
for(i=3;i<10;i++)
Simple[0].word[i]='#';
Simple[1].kindcode=2;
Simple[1].word[0]='a';
Simple[1].word[1]='r';
Simple[1].word[2]='r';
Simple[1].word[3]='a';
Simple[1].word[4]='y';
for(i=5;i<10;i++)
Simple[1].word[i]='#';
Simple[2].kindcode=3;
Simple[2].word[0]='b';
Simple[2].word[1]='e';
Simple[2].word[2]='g';
Simple[2].word[3]='i';
Simple[2].word[4]='n';
for(i=5;i<10;i++)
Simple[2].word[i]='#';
Simple[3].kindcode=4;
Simple[3].word[0]='b';
Simple[3].word[1]='o';
Simple[3].word[2]='o';
Simple[3].word[3]='l';
for(i=4;i<10;i++)
Simple[3].word[i]='#';
Simple[4].kindcode=5;
Simple[4].word[0]='c';
Simple[4].word[1]='a';
Simple[4].word[2]='l';
Simple[4].word[3]='l';
for(i=4;i<10;i++)
Simple[4].word[i]='#';
Simple[5].kindcode=6;
Simple[5].word[0]='c';
Simple[5].word[1]='a';
Simple[5].word[2]='s';
Simple[5].word[3]='e';
for(i=4;i<10;i++)
Simple[5].word[i]='#';
Simple[6].kindcode=7;
Simple[6].word[0]='c';
Simple[6].word[1]='h';
Simple[6].word[2]='a';
Simple[6].word[3]='r';
for(i=4;i<10;i++)
Simple[6].word[i]='#';
Simple[7].kindcode=8;
Simple[7].word[0]='c';
Simple[7].word[1]='o';
Simple[7].word[2]='n';
Simple[7].word[3]='s';
Simple[7].word[4]='t';
Simple[7].word[5]='a';
Simple[7].word[6]='n';
Simple[7].word[7]='t';
for(i=8;i<10;i++)
Simple[7].word[i]='#';
Simple[8].kindcode=9;
Simple[8].word[0]='d';
Simple[8].word[1]='o';
for(i=2;i<10;i++)
Simple[8].word[i]='#';
Simple[9].kindcode=10;
Simple[9].word[0]='e';
Simple[9].word[1]='l';
Simple[9].word[2]='s';
Simple[9].word[3]='e';
for(i=4;i<10;i++)
Simple[9].word[i]='#';
Simple[10].kindcode=11;
Simple[10].word[0]='e';
Simple[10].word[1]='n';
Simple[10].word[2]='d';
for(i=3;i<10;i++)
Simple[10].word[i]='#';
Simple[11].kindcode=12;
Simple[11].word[0]='f';
Simple[11].word[1]='a';
Simple[11].word[2]='l';
Simple[11].word[3]='s';
Simple[11].word[4]='e';
for(i=5;i<10;i++)
Simple[11].word[i]='#';
Simple[12].kindcode=13;
Simple[12].word[0]='f';
Simple[12].word[1]='o';
Simple[12].word[2]='r';
for(i=3;i<10;i++)
Simple[12].word[i]='#';
Simple[13].kindcode=14;
Simple[13].word[0]='i';
Simple[13].word[1]='f';
for(i=2;i<10;i++)
Simple[13].word[i]='#';
Simple[14].kindcode=15;
Simple[14].word[0]='i';
Simple[14].word[1]='n';
Simple[14].word[2]='p';
Simple[14].word[3]='u';
Simple[14].word[4]='t';
for(i=5;i<10;i++)
Simple[14].word[i]='#';
Simple[15].kindcode=16;
Simple[15].word[0]='i';
Simple[15].word[1]='n';
Simple[15].word[2]='t';
Simple[15].word[3]='e';
Simple[15].word[4]='g';
Simple[15].word[5]='e';
Simple[15].word[6]='r';
for(i=7;i<10;i++)
Simple[15].word[i]='#';
Simple[16].kindcode=17;
Simple[16].word[0]='n';
Simple[16].word[1]='o';
Simple[16].word[2]='t';
for(i=3;i<10;i++)
Simple[16].word[i]='#';
Simple[17].kindcode=18;
Simple[17].word[0]='o';
Simple[17].word[1]='f';
for(i=2;i<10;i++)
Simple[17].word[i]='#';
Simple[18].kindcode=19;
Simple[18].word[0]='o';
Simple[18].word[1]='r';
for(i=2;i<10;i++)
Simple[18].word[i]='#';
Simple[19].kindcode=20;
Simple[19].word[0]='o';
Simple[19].word[1]='u';
Simple[19].word[2]='t';
Simple[19].word[3]='p';
Simple[19].word[4]='u';
Simple[19].word[5]='t';
for(i=6;i<10;i++)
Simple[19].word[i]='#';
Simple[20].kindcode=21;
Simple[20].word[0]='p';
Simple[20].word[1]='r';
Simple[20].word[2]='o';
Simple[20].word[3]='c';
Simple[20].word[4]='e';
Simple[20].word[5]='d';
Simple[20].word[6]='u';
Simple[20].word[7]='r';
Simple[20].word[8]='e';
for(i=9;i<10;i++)
Simple[20].word[i]='#';
Simple[21].kindcode=22;
Simple[21].word[0]='p';
Simple[21].word[1]='r';
Simple[21].word[2]='o';
Simple[21].word[3]='g';
Simple[21].word[4]='r';
Simple[21].word[5]='a';
Simple[21].word[6]='m';
for(i=7;i<10;i++)
Simple[21].word[i]='#';
Simple[22].kindcode=23;
Simple[22].word[0]='r';
Simple[22].word[1]='e';
Simple[22].word[2]='a';
Simple[22].word[3]='d';
for(i=4;i<10;i++)
Simple[22].word[i]='#';
Simple[23].kindcode=24;
Simple[23].word[0]='r';
Simple[23].word[1]='e';
Simple[23].word[2]='a';
Simple[23].word[3]='l';
for(i=4;i<10;i++)
Simple[23].word[i]='#';
Simple[24].kindcode=25;
Simple[24].word[0]='r';
Simple[24].word[1]='e';
Simple[24].word[2]='p';
Simple[24].word[3]='e';
Simple[24].word[4]='a';
Simple[24].word[5]='t';
for(i=6;i<10;i++)
Simple[24].word[i]='#';
Simple[25].kindcode=26;
Simple[25].word[0]='s';
Simple[25].word[1]='e';
Simple[25].word[2]='t';
for(i=3;i<10;i++)
Simple[25].word[i]='#';
Simple[26].kindcode=27;
Simple[26].word[0]='t';
Simple[26].word[1]='h';
Simple[26].word[2]='e';
Simple[26].word[3]='n';
for(i=4;i<10;i++)
Simple[26].word[i]='#';
Simple[27].kindcode=28;
Simple[27].word[0]='t';
Simple[27].word[1]='o';
for(i=2;i<10;i++)
Simple[27].word[i]='#';
Simple[28].kindcode=29;
Simple[28].word[0]='t';
Simple[28].word[1]='r';
Simple[28].word[2]='u';
Simple[28].word[3]='e';
for(i=4;i<10;i++)
Simple[28].word[i]='#';
Simple[29].kindcode=30;
Simple[29].word[0]='u';
Simple[29].word[1]='n';
Simple[29].word[2]='t';
Simple[29].word[3]='i';
Simple[29].word[4]='l';
for(i=5;i<10;i++)
Simple[29].word[i]='#';
Simple[30].kindcode=31;
Simple[30].word[0]='v';
Simple[30].word[1]='a';
Simple[30].word[2]='r';
for(i=3;i<10;i++)
Simple[30].word[i]='#';
Simple[31].kindcode=32;
Simple[31].word[0]='w';
Simple[31].word[1]='h';
Simple[31].word[2]='i';
Simple[31].word[3]='l';
Simple[31].word[4]='e';
for(i=5;i<10;i++)
Simple[31].word[i]='#';
Simple[32].kindcode=33;
Simple[32].word[0]='w';
Simple[32].word[1]='r';
Simple[32].word[2]='i';
Simple[32].word[3]='t';
Simple[32].word[4]='e';
for(i=5;i<10;i++)
Simple[32].word[i]='#';
//初始化符号表
for(i=0;i<500;i++)
{
Tab[i].head=NULL;
Tab[i].len=0;
Tab[i].val=0;
Tab[i].addr=NULL;
for(j=0;j<4;j++)
Tab[i].type[j]=Tab[i].kind[j]='#';
}
//初始化缓冲区
for(i=0;i<1000;i++)
Buffer[i]='#';
//初始化字符串表
for(i=0;i<500;i++)
String[i]='#';
Headp=Tail=&String[0];//头尾指针指向字符串表的首地址
}
//查找数字
void checknum()
{
int i,j,k;
float num2;
bool flag=false;
num1=0;
for(i=0;i<=numlen;i++)
{
if(Num[i]!='.')
num1=10*num1+Num[i];
else
break;
}
k=1;//用于表示小数点后的位数
for(i=i+1;i<=numlen;i++)
{
num2=(float)Num[i];
for(j=0;j<k;j++)
{
num2=num2/10;
}
num1+=num2;
k++;
}
if(c==0) //标记符号表的长度
{
c++;
Tab[0].val=num1;
if(token.code==35)
{
Tab[0].type[0]='i';Tab[0].kind[0]='n';
Tab[0].type[1]='n';Tab[0].kind[1]='u';
Tab[0].type[2]='t';Tab[0].kind[2]='m';
fprintf(fp3,"\t\t整数");
fprintf(fp3,"\t常数");
fprintf(fp3,"\t%d", int(Tab[0].val) );
fprintf(fp3,"\t_\n");
}
else
{
Tab[0].type[0]='r';Tab[0].kind[0]='n';
Tab[0].type[1]='e';Tab[0].kind[1]='u';
Tab[0].type[2]='a';Tab[0].kind[2]='m';
Tab[0].type[3]='l';
fprintf(fp3,"\t\t实数");
fprintf(fp3,"\t常数");
fprintf(fp3,"\t%f",Tab[0].val);
fprintf(fp3,"\t_\n");
}
ENTRY=1;
return ;
}
//查找同值项
i=0;
while(i<c)
{
if(Tab[i].val==num1 && Tab[i].kind[0] =='n')
{
ENTRY=i+1; //同值出口不变
flag=true;
return;
}
else i++;
}
if(flag==false) //没有找到同值项
{
c++;
Tab[i].val=num1;
if(token.code==35)
{
Tab[i].type[0]='i';Tab[i].kind[0]='n';
Tab[i].type[1]='n';Tab[i].kind[1]='u';
Tab[i].type[2]='t';Tab[i].kind[2]='m';
fprintf(fp3,"\t\t整数");
fprintf(fp3,"\t常数");
fprintf(fp3,"\t%d",int(Tab[i].val));
fprintf(fp3,"\t_\n");
}
else
{
Tab[i].type[0]='r';Tab[i].kind[0]='n';
Tab[i].type[1]='e';Tab[i].kind[1]='u';
Tab[i].type[2]='a';Tab[i].kind[2]='m';
Tab[i].type[3]='l';
fprintf(fp3,"\t\t实数");
fprintf(fp3,"\t常数");
fprintf(fp3,"\t%f",Tab[i].val);
fprintf(fp3,"\t_\n");
}
ENTRY=i+1;
}
}
//查找字符常数
void checkch()
{
int i=0,j;
char *w;
if(c==0)
{
c++;
Tab[0].head=Tail;
Tab[0].len=idlen+1;
Tab[0].val=0;
Tab[0].addr=NULL;
Tab[0].type[0]=Tab[0].kind[0]='c';
Tab[0].type[1]=Tab[0].kind[1]='h';
Tab[0].type[2]=Tab[0].kind[2]='a';
Tab[0].type[3]=Tab[0].kind[3]='r';
fprintf(fp3,"%d\t%d",c1,Tab[0].len);
fprintf(fp3,"\t字符");
fprintf(fp3,"\t常数");
fprintf(fp3,"\t_\t_\n");
for(j=0;j<=idlen;j++)//把字符常数插入字符串表中
{
*Tail=Word[j];
Tail++;
c1++;
}
ENTRY=1;
return;
}
//查找是否有相同的字符串
i=0;
while(i<c)
{ //Tab[i].head =Tail;
w=Tab[i].head;
if(Tab[i].type[0]=='c')
{
for(j=0;j<=idlen;j++)
{
if(*w==Word[j])
w++;
else
break;
}
if(j==idlen+1)
break;
}
i++;
}
if(j==idlen+1)
{
ENTRY=i+1;
return ;
}
else
{
//没有相同的项
//i=0;
while(Tab[i].type[0]!='#')
i++;
// i=c;
c++;
Tab[i].head=Tail;
Tab[i].len=idlen+1;
fprintf(fp3,"%d\t%d",c1,Tab[i].len);
fprintf(fp3,"\t字符");
fprintf(fp3,"\t常数");
fprintf(fp3,"\t_\t_\n");
Tab[i].type[0]=Tab[i].kind[0]='c';
Tab[i].type[1]=Tab[i].kind[1]='h';
Tab[i].type[2]=Tab[i].kind[2]='a';
Tab[i].type[3]=Tab[i].kind[3]='r';
// w=Tab[i].head;
for(j=0;j<=idlen;j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -