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

📄 gramma_paradise.cpp

📁 递归下降的语法分析程序
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<string.h>
struct cifa
{	int syn;
    char *token;};
cifa cf[80];
int i=0,kk=0,l=0;
void scaner();
void lrparser();
void yucu();
void statement();
void expression();
void term();
void factor();
char scanner(int Len,char * Str)
{	int j=0,k=0,m=0,n=0;
	char ch;
	char skey[]="";
 for(j=0;j<10;j++){skey[j]='\0';}//置空	
	while(i<Len)
	{	if(Str[i]!=' ')//滤掉空格
{cf[m].token=new char[];//分配空间
	for(j=0;j<=k;j++)cf[m].token[j]='\0';
		switch(Str[i])
		{case '+': n=13; break;
		case '-': n=14;	break;
		case '*': n=15; break;	
		case '/': n=16;	break;
		case ':': i++; if(Str[i]=='=')
{n=18;skey[0]=Str[i-1];skey[1]=Str[i];}
		else
		{n=17;skey[0]=Str[i-1];} break;
		case '<': i++;
		if(Str[i]=='>')
{n=21;skey[0]=Str[i-1];skey[1]=Str[i];}
	else	{	if(Str[i]=='=')
{n=22;skey[0]=Str[i-1];skey[1]=Str[i];}
	else	{n=20;skey[0]=Str[i-1];}	}
	break;
 case '>': i++; if(Str[i]=='=')
{ n=24;skey[0]=Str[i-1];skey[1]=Str[i];}else {n=23;skey[0]=Str[i-1];} break;
	case '=': n=25;	break;
	case ';': n=26;	break;
	case '(': n=27;	break;
	case ')': n=28;	break;
	case '#': n=0;  	break;
	case 'b': k=strlen("begin");
for(j=i;j<k+i;j++)
{skey[j-i]=Str[j];	}
if(strncmp(skey,"begin",k)==0)
{n=1;i=i+k-1;}
else
{  for(j=0;j<=k;j++){skey[j]='\0';}
j=i; skey[j-i]=Str[j]; j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
	{ 
skey[j-i]=Str[j];	j++;}
	 n=10;	k=j-i;i=j-1;}	break;
	case 'i': k=strlen("if");
for(j=i;j<k+i;j++)
{skey[j-i]=Str[j];	}
if(strncmp(skey,"if",k)==0)
	{n=2;i=i+k-1;}
else			{  for(j=0;j<=k;j++){skey[j]='\0';}
		j=i; skey[j-i]=Str[j]; j++;
	while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
	{ 
	skey[j-i]=Str[j];	j++;} n=10;
	k=j-i; 	i=j-1;}break;
	case 't': k=strlen("then");
		for(j=i;j<k+i;j++)
	{   skey[j-i]=Str[j];	}
		if(strncmp(skey,"then",k)==0)
	{n=3;i=i+k-1;}
		else
	{  for(j=0;j<=k;j++){skey[j]='\0';}
		j=i; skey[j-i]=Str[j]; j++;
	while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
	{ 	skey[j-i]=Str[j];	
	j++;} n=10; k=j-i; i=j-1; } break;
		case 'w': k=strlen("while");
	for(j=i;j<k+i;j++)
	{ skey[j-i]=Str[j]; }		
	if(strncmp(skey,"while",k)==0)
		{n=4;i=i+k-1;}
		else
		n=10;break;
          case 'd': k=strlen("do");
	for(j=i;j<k+i;j++)
{ skey[j-i]=Str[j];	}
if(strncmp(skey,"do",k)==0)
	{n=5;i=i+k-1;}
else			{  for(j=0;j<=k;j++){skey[j]='\0';}
		j=i; skey[j-i]=Str[j]; j++;
	while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
	{ 
	skey[j-i]=Str[j];	j++;}
  n=10; k=j-i; i=j-1;	} break;
case 'e': k=strlen("end");
	for(j=i;j<k+i;j++)
	{skey[j-i]=Str[j];	}
if(strncmp(skey,"end",k)==0)
{n=6;i=i+k-1;}
	else
{  for(j=0;j<=k;j++){skey[j]='\0';}
	j=i; skey[j-i]=Str[j]; j++;
				while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{ skey[j-i]=Str[j];
j++;}
		n=10; k=j-i; i=j-1; } break;
default:
if(Str[i]>'a'&&Str[i]<'z'||Str[i]>'A'&&Str[i]<'Z'||Str[i]=='a'||Str[i]=='z'||Str[i]=='A'||Str[i]=='Z')//字母打头
{   
	j=i;	skey[j-i]=Str[j];j++;
	while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{ skey[j-i]=Str[j];	j++;}
 n=10; k=j-i; i=j-1; }
	else 
{if(Str[i]>'0'&&Str[i]<'9'||Str[i]=='0'||
	Str[i]=='9')//数字组合
	{	j=i;	skey[j-i]=Str[j];j++;
while(Str[j]>'0'&&Str[j]<'9'||Str[j]=='0'||Str[j]=='9')
{skey[j-i]=Str[j];j++;}
n=11;	k=j-i; i=j-1;}
else n=-1;	} break;	}	
	if(skey[0]=='\0')
{	cf[m].syn=n;
	cf[m].token[0]=Str[i]; }
else
	{cf[m].syn=n;
	 strcpy(cf[m].token,skey); }
for(j=0;j<=k;j++){skey[j]='\0';}
m++;}i++;}	
	return ch;}
void scaner()
{	cf[l]; l++;}
void lrparser()
{  if(cf[l].syn==1)
  { scaner();
	 yucu();
   if (cf[l].syn==6)
   {scaner();
	   if (cf[l].syn==0&&kk==0)
      cout<<"success!"<<endl;   }
  else 
  {  if(kk!=1)cout<<"be short of:end,error!"<<endl;  kk=1; }}
  else 
{
cout<<"be short :begin,error!"<<endl;
  kk=1;}}
void yucu()
{   statement();
	while(cf[l].syn==26)
	{scaner();
	statement();}
	return;
}

void statement()
{
	if(cf[l].syn==10)
	{scaner();
	if(cf[l].syn==18)
	{scaner();
	expression();}
	else {cout<<"赋值号错误!"<<endl;kk=1; }
	}
	else {cout<<cf[l].syn<<cf[l].token<<endl; 
	cout<<"语句错误!"<<endl;kk=1;}
}

void expression()
{
	term();
	while(cf[l].syn==13||cf[l].syn==14)
	{scaner();
	term();}
	return;
}

void term()
{
	factor();
	while(cf[l].syn==15||cf[l].syn==16)
	{scaner();
	 factor();
	}
	return;
}


void factor()
{
	if(cf[l].syn==10||cf[l].syn==11)
	{scaner();}
	else {
		if(cf[l].syn==27)
		{
scaner();
		expression();
		}
else {cout<<"'('错误!"<<endl;kk=1;}
		if (cf[l].syn==28)
		{scaner();}
else {cout<<"')'错误!"<<endl; kk=1;}
cout<<"表达式错误!"<<endl; kk=1;}
	return;
}
void main()
{	fstream infile;
	infile.open("file1.txt",ios::in);
	if(!infile)
	{
		cout<<"file1.txt can't open.\n";
		abort();
	}
	int len;
	char  s[100], str[100];
	while(!infile.eof())
	{
infile.getline(s,sizeof(s));
	cout<<s<<endl;
	strcpy(str,s);
	len=strlen(s);
	if(i<len)
	{
scanner(len,str);}
	}
	lrparser();
	infile.close();
}

⌨️ 快捷键说明

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