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

📄 word.h

📁 小型对delphi编译器包括语法语义及词法
💻 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 + -