⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.cpp

📁 这是一个scanner源程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -