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

📄 function.h

📁 词法分析器,本程序是C语言的一个子集的词法分析程序,只能识别整型数字和部分关键字和部分符号。
💻 H
字号:
//function.h
//单词识别器,input为原串,des存放识别出的单词,len为des的长度,
//pos为原串的识别位置,返回单词种类:1--数字,2--变量,0--操作符和保留字
#include "stack.h"
int isnum(char ch)
{
	return (ch>='0'&&ch<='9');
}
int isop(char ch)
{
	if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='^')
		return 1;
	  return 0;
}
int issmallchar(char ch)
{
	return (ch>='a'&&ch<='z');
}
int isbigchar(char ch)
{
	return (ch>='A'&&ch<='Z');
}
int ischar(char ch)
{
	return issmallchar(ch)||isbigchar(ch);
}
int  getword(char input[],char des[],int &len,int &pos)
{
	if(isop(input[pos]))
	{
		len=1;
		 des[0]=input[pos];
		  des[1]='\0';
		  pos++;
		   return 0;
	}
	if(isnum(input[pos]))
	{
		len=1;
		 des[len-1]=input[pos];
		  pos++;
		   while(isnum(input[pos]))
		   {
			   len++;
			    des[len-1]=input[pos];
				 pos++;
		   }
		   des[len]='\0';
		   return 1;
	}
	if(ischar(input[pos]))
	{
		len=1;
		 des[len-1]=input[pos];
		  pos++;
		   while(isnum(input[pos])||ischar(input[pos]))
		   {
			   len++;
			    des[len-1]=input[pos];
				 pos++;
		   }
		   des[len]='\0';
		   return 2;
	}
	if(input[pos]=='#')
	{
		len=1;
		 des[len-1]=input[pos];
		  des[len]='\0';
		  pos++;
		  return 3;// input到结尾了!
	}
    if(input[pos]==' ')
	{
		len=0;
		 pos++;
		  return 4;//过滤空格
	}
	      len=0;
		   pos++;
		    return 5;//遇到不能够识别字符,报错并且跳过
}
int getwordrank(char ch1,char ch2)//只能比较两个字符
{
	if(isnum(ch1)||issmallchar(ch1))
		ch1='i';
	  if(isnum(ch2)||issmallchar(ch2))
		  ch2='i';
	if(ch1=='+'||ch1=='-')
	{
		if(ch2=='+'||ch2=='#'||ch2==')'||ch2=='-')
			return 1;
		else
			return -1;
	}
	if(ch1=='*'||ch1=='^'||ch1=='/')
	{
		if(ch2=='^'||ch2=='('||ch2=='i')
			return -1;
		 else
			 return 1;
	}
	if(ch1=='i'||ch1==')')
	{
		if(ch2=='i'||ch2=='(')
			return 2;
		 else
			 return 1;
	}
	if(ch1=='(')
	{
		if(ch2=='#')
			return 2;//error
		 else
			 if(ch2==')')
				 return 0;
			 return -1;
	}
	if(ch1=='#')
	{
		if(ch2=='#')
			return 0;
		 else
			 if(ch2==')')
				 return 2;
			   else
				   return -1;
	}
	return 2;
	//0表示等于,1表示大于,-1表示小于,2表示没有优先关系
}
int getrank(char str1[],char str2[])
{
	char ch1=str1[0],ch2=str2[0];
	 return getwordrank(ch1,ch2);
}
int  newtemp(char str[],int i)
{  //这里产生的变量不会超过999
	str[0]='T';
	 int j=1;
	   if(i>=100)
	   {
		   str[1]=i/100+'0';
		    i/=10;
		    str[2]=i/10+'0';
			 str[3]=i%10+'0';
			  str[4]='\0';
			  return 4;
	   }
	   else
		   if(i>9)
		   {
			   str[1]=i/10+'0';
			    str[2]=i%10+'0';
				 str[3]='\0';
				  return 3;
		   }
		   else
		   {
			   str[1]=i+'0';
			    str[2]='\0';
				 return 2;
		   }
}
void  transnode(node nod,char str[])
{
	for(int i=0;i<nod.namelen;i++)
		str[i]=nod.name[i];
	 str[i]='\0';
}
void transblock(block bl,char str[],int type)
{
	int i;
	if(type==1)
	{
		for(i=0;i<int(strlen(bl.v1));i++)
			str[i]=bl.v1[i];
	}
	else
		if(type==2)
		{
			for(i=0;i<int(strlen(bl.v2));i++)
				str[i]=bl.v1[i];
		}
		else
			if(type==3)
			{
				for(i=0;i<int(strlen(bl.result));i++)
					str[i]=bl.result[i];
			}
    str[i]='\0';
}
int chisvt(char str[])
{
	return isnum(str[0])||isop(str[0])||str[0]=='#';
}
int nodeisvt(node nod)
{
	return chisvt(nod.name);
}
void out(int num,char ch)
{
	for(int i=0;i<num;i++)
		cout<<ch;
}
node guiyue(node ch[],int len,stack1 &snum,stack1 &svar,stack1 &s,int &num)
{
	if(len<1||len>3)
	{
		cout<<"规约出错!"<<endl;
		exit(0);
	}
	char str[4];
	 node tem;
	  int leng,flag=1,i;
    if(len==1)
	{
		leng=newtemp(str,num);
		 num++;
		 tem.encode=2;
		  tem.namelen=leng;
		   for(int i=0;i<leng;i++)
			   tem.name[i]=str[i];
		    tem.name[i]='\0';
		    tem.value=snum.search(ch[0].name,len,flag);
			s.push(tem);
			svar.push(tem);
			out(35,' ');
			cout<<ch[0].name<<" 规约为:"<<tem.name<<"="<<tem.value<<" 不产生代码!"<<endl;
	}
	else
		if(len==3)
		{
			if(chisvt(ch[1].name))
			{
			    int num1,num2;
				 leng=newtemp(str,num);
				  num++;
				  tem.encode=2;
				   tem.namelen=leng;
				    for(int i=0;i<leng;i++)
						tem.name[i]=str[i];
					  tem.name[i]='\0';
					num1=svar.search(ch[0].name,ch[0].namelen,flag);
					flag=1;
					num2=svar.search(ch[2].name,ch[2].namelen,flag);
					if(ch[1].name[0]=='+')
						tem.value=num1+num2;
					 else
						 if(ch[1].name[0]=='-')
							 tem.value=num1-num2;
						 else
							 if(ch[1].name[0]=='*')
								 tem.value=num1*num2;
							 else
								 if(ch[1].name[0]=='/')
									 tem.value=num1/num2;
								 else
									 if(ch[1].name[0]=='^')
									 {
										 int t=1;
										 for(i=0;i<num2;i++)
											 t*=num1;
										 tem.value=t;
									 }
						s.push(tem);
						svar.push(tem);
						out(35,' ');
             	 for(i=0;i<3;i++)
					 cout<<ch[i].name;
                  cout<<" 规约为:"<<tem.name<<"="<<tem.value<<" 产生代码:"<<"('"<<ch[1].name[0]<<"',"<<ch[0].name<<","<<ch[2].name<<","<<tem.name<<")"<<endl;
			}
			else
			{
				leng=newtemp(str,num);
				 num++;
				  tem.encode=2;
				   tem.namelen=leng;
				    for(i=0;i<leng;i++)
						tem.name[i]=str[i];
					tem.name[i]='\0';
					 flag=1;
					tem.value=svar.search(ch[1].name,ch[1].namelen,flag);
					s.push(tem);
					svar.push(tem);
					 out(35,' ');
				      for(i=0;i<3;i++)
				    	cout<<ch[i].name;
                            cout<<" 规约为:"<<tem.name<<"="<<tem.value<<" 不产生代码!"<<endl;
			
			}
		}
		return tem;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -