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

📄 fenxi.cpp

📁 一个递归下降分析程序,实现了对语法分析程序所提供是单词序列的语法检查和结构,并实现了简单语言进行语法分析.
💻 CPP
字号:
#include <iostream.h>            //定义I/o库所用的某些宏和变量
#include <string.h>              //定义字符串库函数
#include <stdio.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,kk=0;                //p是缓冲区prog 的指针,m 是token 的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
void term();
void statement();
void foctor();
void expression();
void yucu();
void main()
{
    void irparser();
    void scaner();      //对 scaner 函数进行声明
p=0;
cout<<"\n please input string:\n"<<endl;
do 
{
	scanf("%c",&ch);
	prog[p++]=ch;        //输入源程序字符串,送入缓冲区
}
while (ch!='#');
p=0;
//do
//{
	scaner();                //调用词法分析函数
    irparser();
//}while(ch!=0);
}
 void scaner()
{
	for(n=0;n<8;n++)
		token[n]=NULL;
	m=0;
	ch=prog[p++];       //读下一个字符
	while(ch==' ')
		ch=prog[p++];    //读下一个字符
	if((65<=ch && ch<=90)||(97<=ch && ch<=122))   //ch是字母字符
	{
		while((65<=ch && ch<=90)||(97<=ch && ch<=122)||(48<=ch && ch<=57))  //ch为字母字符或数字字符
		{
		token[m]=ch;
		m++;
		ch=prog[p++];         //读下一个字符
		}
	token[m++]='\0';
	p--;                //回退一个字符
	syn=10;
	for(n=0;n<6;n++)
		if(strcmp(token,rwtab[n])==0)
		{
			switch(n)                    //给出syn的值
			{
             case 0:syn=1;break;
		     case 1:syn=2;break;
		     case 2:syn=3;break;
		     case 3:syn=4;break;
		     case 4:syn=5;break;
			 case 5:syn=6;break;
			}
		}
	}
	else if(ch>=48 && ch<=57)        //如果ch数字字符
		{
		  while(ch>=48 && ch<=57)    //当ch为数字字符时
		  {
			sum=sum*10+ch-'0';
			ch=prog[p++];        //读下一个字符
		  }
		  p-- ;                   //回退一个字符
		  syn=11;
		}
	else
	switch(ch)
	{
		case'<':m=0;token[m++]=ch;
			    ch=prog[p++];     //读下一个字符
				if(ch=='>') 
				{
					syn=21;
					token[m++]=ch;
				}
				else if(ch=='=')
				{
					syn=22;
					token[m++]=ch;
				}
				else  { syn=20;  p-- ; }     //回退一个字符
				break;
		case'>':m=0;
			    token[m++]=ch;
			    ch=prog[p++];          //读下一个字符
				if(ch=='=')
				{
					syn=24;
					token[m++]=ch;        //将>=的种别码赋给syn
				}
				else
				{
					syn=23;           //将>的种别码赋给syn
					p--; 
				}
				break;
		case':':m=0;token[m++]=ch;
			    ch=prog[p++];  
				if(ch=='=')
				{
					syn=18;          //将:=的种别码赋给syn
                    token[m++]=ch;
				}
				else
				{
					syn=17;         //将:的种别码赋给syn
					p--;  
				}
				break;
	
				case'+':syn=13;token[0]=ch;break;
		        case'-':syn=14;token[0]=ch;break;
	          	case'*':syn=15;token[0]=ch;break;
	           	case'/':syn=16;token[0]=ch;break;
	          	case'=':syn=25;token[0]=ch;break;
	            case';':syn=26;token[0]=ch;break;
	        	case'(':syn=27;token[0]=ch;break;
	            case')':syn=28;token[0]=ch;break;
	        	case'#':syn=0;token[0]=ch;break;
		        default:syn=-1;
}}

 void irparser()
{
	if(syn==1)
	{
		scaner();
	    yucu();
		if(syn==6)
		{
			scaner();
		    if(syn==0&&(kk==0))
			cout<<"success"<<endl;
		}
		else 
		{
			if(kk!=1)
		    cout<<"缺 end 错误"<<endl;kk=1;
		}
	}
	else{cout<<"缺 begin 错误"<<endl;kk=1;}
		return;
}

	void yucu()
	{
	statement();
	while(syn==26)
	{
		scaner();
		statement();
	}
	return;

	}
 void statement()
	{
	if(syn==10)
	{
		scaner();
	    if(syn==18)
		{
			scaner();
	        expression();
		}
	    else{cout<<"赋值号错误"<<endl;kk=1;}
	}
	else{cout<<"语句错误"<<endl;kk=1;}
	return;
	}

	void expression()
	{
		term();
		while(syn==13 || syn==14)
		{scaner();
		term();
		}
		return;
	}

	void term()
	{
		foctor();
		while(syn==15 || syn==16)
		{
			scaner();
			foctor();
		}
		return;
	}

	void foctor()
	{
		if(syn==10 || syn==11)
			scaner();
		else if(syn=27)
		{
			scaner();
			expression();
			if(syn==28)
			scaner();
			else
			{
			cout<<"')'错误"<<endl;
			kk=1;
			}
		}
		else{cout<<"表达式错误"<<endl;kk=1;}
		return;
	}
	

⌨️ 快捷键说明

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