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

📄 yufa.cpp

📁 1.词法分析 设计、编制并调试该C语言子集的词法分析程序
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<malloc.h>
#define M 5
#define N 6
#define null 0
typedef struct node{//创建存放字符的数据结构
	char c;
	struct node *next;
}stack;
typedef struct node1{
	char *d;
}table[M][N];
void createtable(table a)//创建预测分析表
{ char *b;
  cout<<"请输入预测分析表的元素:";
	for(int i=0;i<M;i++)
	{ for(int j=0;j<N;j++)
		{b=new char;
		  a[i][j].d=new char;
	      cin>>b;
	      strcpy(a[i][j].d,b);
		  //cout<<"a[i][j]="<<a[i][j].d<<endl;
		  //cout<<endl<<a[i][j].d[0]<<endl<<a[i][j].d[1];
		 }
	}
}
void printtable(table a)//打印二维数组的元素
{ int n=0;
	for(int i=0;i<M;i++)
	{ for(int j=0;j<N;j++)
         cout<<a[i][j].d<<'\t';
		 cout<<endl;
	}
}
int checktable(table a,int i,int j)//检查a[i][j]是产生式吗
{ 
	if(a[i][j].d!="0")
            return 1;
    else 
		    return 0;
}
stack *initiate(stack *s)//初始化堆栈
{ s=(stack *)malloc(sizeof(stack));
  s->next=null;
  return s;
}
stack *searchtail(stack *s)//搜索队尾元素
{ 
   while(s->next!=null)
	   s=s->next;
   return s;
}
stack *searchtail1(stack *s)//搜索队尾元素的前一个元素
{ 
   while(s->next->next!=null)
	   s=s->next;
   return s;
}
char queuestack1(stack *s)//上托栈顶符号
{ char d;
 stack *s2=s;
  stack *s1=s;
  s1=searchtail(s1);
  s2=searchtail1(s2);//搜索队尾元素的前一个元素
   d=s1->c;
   s2->next=s1->next;
   delete s1;
   return d;
}
char queuestack2(stack *s)//从堆栈尾取非终结符
{ char d;
  stack *s1=s;
  s1=searchtail(s1);
  d=s1->c;
  return d;
}
stack *queuetail(stack *s)//删除队尾元素
{ stack *s1=s;
  s1=searchtail(s1);
  stack *s2=s;
  s2=searchtail1(s2);
  s2->next=s1->next;
  delete s1;
  return s;
}
void Enstack(stack *s,char d)//元素入堆栈从队头插入
{ stack *s1;
  s1=(stack *)malloc(sizeof(stack));
  s1->c=d;
  s1->next=s->next;
  s->next=s1;
}
void Enstack1(stack *s,char d)//元素入堆栈从队尾插入
{stack *s1;
 stack *s2=s;
  s1=(stack *)malloc(sizeof(stack));
  s1->c=d;
  s2=searchtail(s2);//搜索队尾元素
	  s1->next=s2->next;
      s2->next=s1;
}
void create1(stack *s)//创建输入符号堆栈
{  char c; 
    cout<<"输入你要输入的符号串\n";
	while(1){
	cin>>c;
    Enstack(s,c);
	if(c=='#')
		break;
	}
}
void create2(stack *s)//创建一个分析栈
{ char c;
  cout<<"输入你要入分析栈的元素\n";
 cout<<"如果结束请输入Y或y否则继续输入:\n";
  while(1){
	 cin>>c;
	  if(c=='Y'||c=='y')
			  break;
	  Enstack(s,c);
	 }
}
void print(stack *s)
{ stack *s1;
  s1=s;s1=s1->next;
  while(s1!=null)
  { cout<<s1->c;
    s1=s1->next;
  }
  cout<<endl;
}
int create3(char VN[])//创建的字符数组,返回数组元素的个数
{ char c;
  int i=0;
	cout<<"输入你所要创建的字符数组的元素:\n";
	cout<<"如果输入完毕请按Y或y\n";
      while(1)
	 { cin>>c;
	   if(c=='Y'||c=='y')
		   break;
	   VN[i]=c;
	   i++;
	 }
	  return i;
}
int CheckVT(char a[],int b,char c)//检查数组中是否有元素c
{
    int i;
	for( i=0;i<b;i++)
	{
		if(c==a[i])
          break;
		else 
			continue;
		}
       if(i==b)
		   return 0;
	   else 
		   return i;
	}
int position(char a[],int b,char c)//从数组a中返回元素c的位置b为长度
{ for(int i=0;i<b;i++)
	{ if(a[i]==c)
          break;
	}
   return i;
}
void printfrs(stack *s,stack *s1,char *s2,int i)//打印结果
{
  cout<<i;
	  
   stack *s3,*s4;
   s3=s;s4=s1;
   s3=s3->next;s4=s4->next;
   while(s3!=null)
   { cout<<s3->c;
     s3=s3->next;
   }
   cout<<"\t";
   while(s4!=null)
   { cout<<s4->c;
     s4=s4->next;
   }
  cout<<"\t";
   cout<<s2;
}
int getlength(char *s)
{ 
   int i=0;
   while(s[i]!='\0')
	   i++;
   return i;
}
void main()
{
char VN[10];//存放非终结符数组
  char VT[10];//存放终结符数组
  char X,a;
  int ff=1;
  char *bc;
  bc=new char;
  int hh,hh0;
  table aa;
// char cc;
 createtable(aa);
 printtable(aa);//打印二维数组的元素
  int length1,length2;//非终结符和终结符的长度
 length1=create3(VN);//创建的字符数组,返回数组元素的个数
 length2=create3(VT);
stack *s=0;//输入符号堆栈
  s=initiate(s);
  create1(s);//创建输入符号堆栈
 print(s);
  stack *s1=0;
  s1=initiate(s1);
  create2(s1);//创建一个分析栈
  //X=queuestack1(s1);//上托栈顶符号送X
  a=queuestack2(s);//从堆栈尾取非终结符
  while(1){
	  X=queuestack1(s1);//上托栈顶符号送X
      if(CheckVT(VT,length2,X))
		{ if(X=='a')
			{//cc=a;
	         s=queuetail(s);//删除队尾元素
					a=queuestack2(s);
				}
		 else 
			{
			 cout<<"该句子不是合法的句子:"<<endl;
             return;
			}
		}
  else 
		{ if(X=='#')
				{
					if(X=='a')
						{ cout<<"该句子是合法的句子:"<<endl;
						return ;
						}
					else {cout<<"该句子不是合法的句子:"<<endl;
                        return;
						}
				}
          else 
				{ hh=position(VT,length2,a);
		          hh0=position(VN,length1,X);
				  strcpy(bc,aa[hh0][hh].d);
				  int i=0;
                   if(checktable(aa,hh0,hh))
						{i=getlength(aa[hh0][hh].d); 
					     while(1){
					                if(aa[hh0][hh].d!="e")
										{ 
							             Enstack1(s1,aa[hh0][hh].d[i-1]);
								           i--;
								          if(i==-1)
											  break;
										}
							}
						}
				   else 
					{
					   cout<<"该句子不是合法的句子:"<<endl;
				      return;
					}
				}
		}
  printfrs(s1,s,bc,ff);//打印结果
	  ff++;
  }
 }

⌨️ 快捷键说明

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