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

📄 s.cpp

📁 This a little compile thoery programme.Programme tool is Visual C++ 6.0.
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char vt[30],vn[20],vn1[20][20],stack[20],current;
/////vt[]中级符数组,vn[20]非中级符数组,vn1[20][20]辅助存储非中级符所在结构体位置;
///////////*stack堆栈,current待检测字符串的当前字符
struct analyse
{   char head;
    char body[20];
    char predict[10];
};
int number=0,top=0; //////////number记录所用结构体数组个数,top栈的位置
int findv(char *a,char ch);///在数组中查找字符
void inputchan( );////////////输入产生式
void push(char ch);///////////进栈
char pop();///////////////////出栈
void read(char ch);///////////读待检测字符串的字符到current中
analyse tt[15];///////////////结构体数组变量
/////////////////////////////////////////////////
///////////////////////////////////////////////////
void main()
{char carry[15],ch;/////carry为待检测字符串,
 int d=0,k=0,kk,kkk,ii,f;//////////k=0,kk,kkk栈顶当前字符为非中级符,查找其预选集
 cout<<"请输入产生式"<<endl;
 inputchan();
 cout<<"请输入各个产生式的预选集"<<endl;
 getchar();

 for(ii=0;ii<number;ii++)
 {	  ch=getchar();
     for(int j=0;ch!=10;j++)
	 {  tt[ii].predict[j]=ch;
	   ch=getchar();
	 }
 }
 //cout<<"好"<<endl;
 for(ii=0;ii<=number;ii++)
 cout<<int(vn1[ii][0])<<endl;
 
 cout<<"请输入待分析的字符串"<<endl;
 ch=getchar();
 for(d=0;ch!=10;d++)
 {carry[d]=ch;
  ch=getchar();
 }
 cout<<"准备分析"<<endl;
 //////////
 for(int c=0;c<number;c++) printf("%c, %s, %s\n",tt[c].head,tt[c].body,tt[c].predict);
top=0;
d=0;
push('#');
push(vn[0]);
read(carry[d++]);
printf("%s,%s\n",vn,vt);
ls1: 
ch=pop();cout<<"当前栈顶字符"<<ch<<"当前指针分析字符"<<current<<endl;
 if(ch=='#'&&current=='#')
  cout<<"待分析字符分析成功"<<endl;
 else
 {//////////////查找中级符
	 if(ch==vn[0])
	{  for(int a=int(strlen(tt[0].body))-1;a>=0;a--) push(tt[0].body[a]);putchar(ch);
	 printf("出栈");printf("%s",tt[0].body);printf("进栈\n");goto ls1;
	  
	 }
     f=findv(vt,ch);
     if(f!=50)
	   if(ch==current)
		{///char ch1=pop();
	      read(carry[d++]);goto ls1;}
       else 
		  cout<<"当前指针分析字符不是合法的中级符,分析失败!!!"<<endl;
	else
//////////////查找非中级符号 cout<<"好1"<<endl;
	{  	f=findv(vn,ch);
	     if(f!=50) //cout<<"好2"<<endl;cout<<int(strlen(vn1[f]))<<int(strlen(vn1[f+1]))<<int(vn1[f][0])<<int(vn1[f+1][0])<<endl;
		   for(kkk=0;kkk<int(strlen(vn1[f]));kkk++)
		   {k=int(vn1[f][kkk]);
		    kk=findv(tt[k].predict,current);
			if(kk!=50) break;
		   }
	    if(kkk<int(strlen(vn1[f])) )
		{////////pop();
			 
	     for(int a=int(strlen(tt[k].body))-1;a>=0;a--)
		    push(tt[k].body[a]);
		 putchar(ch);printf("出栈");printf("%s",tt[k].body);printf("进栈\n");
	        goto ls1;
		}
		else
			cout<<"当前指针分析字符与产生式预选集不匹配,分析失败!!!"<<endl;
		}
	
 }
}
////////////////////////////////////
/////////////////////////////////////
void inputchan(  )
{char ch;
 ch=getchar();
 for(int k=0;ch!='@';k++)
 {  int i=0;///////////body位置*vn1[j]=ch;
    tt[k].head=ch;
	for(int j=0;j<int(strlen(vn))&&vn[j]!=ch;j++);
	if (j==int(strlen(vn))) {vn[j]=ch;vn1[j][0]=k;vn1[j][1]='\0';}
	else
	{vn1[j][strlen(vn1[j])]=k;vn1[j][strlen(vn1[j])+1];}
    if(getchar()=='-'&&getchar()=='>')
    while((ch=getchar())!=10 && ch!='@')
    {  tt[k].body[i++]=ch;////////body位置
      if(!isupper(ch))
	  {for(int j=0;vt[j]!=ch&&j<int(strlen(vt));j++);
	    if (j==int(strlen(vt))) vt[j]=ch; 
	  } 
   }
	ch=getchar();
}
 number=k;
}
///////////////
int findv(char *a,char ch)

{for(int j=0;a[j]!=ch &&j<int(strlen(a));j++);
  if(j<int(strlen(a)))
	  return j;
  else
     return 50;
}
////////////////////
void push(char ch)
{stack[top++]=ch;
}
char pop()
{return stack[--top];
}
////////////////////
void read(char ch)
{current=ch;
}

⌨️ 快捷键说明

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