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

📄 syntax.cpp

📁 编译器很好用
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include"scanner.h"

int flag=1;
extern int lineno;

int BLK(ifstream&,int);
int constant(ifstream&,int);
int vary(ifstream&,int);
int funcpro(ifstream&,int);
int CS(ifstream&,int);
int IDT(ifstream&,int);
int sentence(ifstream&,int);
int ET(ifstream&,int);
int CE(ifstream&,int);
int E(ifstream&,int);
int T(ifstream&,int);
int F(ifstream&,int);
void error(int);



void main( )
{
	int a;
	
	ifstream sf("c:\\file.txt");
	if(sf.fail())
	{
		cerr<<"error opening file EL.txt\n";
		return;
	}
	a=scanner(sf);
	
	if(a==13)		a=scanner(sf);//program     程序的第一句
	if(a==21)		a=scanner(sf);//自己定义的变量
	if(a!=24)		//;
		error(13);
	else
		a=scanner(sf);//进入分程序

	a=BLK(sf,a);


	if(a!=26)	
	error(14);

	cout<<"this syntax has been completed!"<<endl;
	if(flag)
		cout<<"this grammar of source program is regular."<<endl;
	else
		cout<<"this grammar of source program is wrong!"<<endl;
	
	sf.close();
}

void error(int err)
{
	cout<<lineno<<" line! :";
	switch(err)
	{
	case 0: cout<<" expected'('"<<endl;		break;
	case 1: cout<<" expected'因子'"<<endl;	break;
	case 2: cout<<" expected':='"<<endl;	break;
	case 3: cout<<" expected'then'"<<endl;	break;
	case 4: cout<<" expected'do'"<<endl;	break;
	case 5: cout<<" expected')'"<<endl;		break;
	case 6: cout<<" expected'begin'"<<endl;	break;
	case 7: cout<<" expected'end'"<<endl;	break;
	case 8: cout<<" expected'标识符'"<<endl;break;
	case 9: cout<<" expected'常量'"<<endl;	break;
	case 10: cout<<" expected'='"<<endl;	break;
	case 11: cout<<" expected':'"<<endl;	break;
	case 12: cout<<" 缺interger说明"<<endl;	break;
	case 13: cout<<" expected';'"<<endl;	break;
	case 14: cout<<" expected'.'"<<endl;	break;
	case 15: cout<<" 不认识字符"<<endl;		break;
	case 16: cout<<" 标识符重定义"<<endl;	break;
	case 17: cout<<" 整数越界"<<endl;		break;
	case 18: cout<<" 标识符未定义"<<endl;	break;
	default: cout<<" ..."<<endl;			break;
	}
	flag=0;
}


int BLK(ifstream& sf,int a)
{
	if(a==27)							//(
	{
		a=scanner(sf);					
		//缺处理形参
		if(a!=28)						//存在形参的处理
		{
			a=IDT(sf,a);
			if(a!=25)					//缺:
				error(11);
			else
				a=scanner(sf);

			if(a!=9)					//缺interger
				error(12);
			else
				a=scanner(sf);
			
		}

		if(a!=28)					//缺 )
			error(5);	
		else
			a=scanner(sf);

		if(a!=25)					//缺:
			error(11);
		else
			a=scanner(sf);

	if(a!=9)						//缺interger
		error(12);
	else
		a=scanner(sf);
	
	if(a!=24)						//缺;
		error(13);
	else
		a=scanner(sf);
	}


	
	
	
	if(a==2)			//常量定义
	{
		a=scanner(sf);
		a=constant(sf,a);
	}
	
	if(a==18)   	//变量说明
	{
		a=scanner(sf);
		a=vary(sf,a);		
	}
	if(a==7)		//函数说明
	{
		a=scanner(sf);
		a=funcpro(sf,a);	
	}
	while(a==7)
	{
		a=scanner(sf);
		a=funcpro(sf,a);
	}

	if(a!=1)							//复合语句
		error(6);
	else
	{
		a=scanner(sf);
		a=CS(sf,a);
	}

	if(a!=24&&a!=26)					//缺';'或者'.'
	{
		error(13);
	}
	

	return a;
}

int constant(ifstream& sf,int a)
{
	if(a==21)	a=scanner(sf);
	if(a==38)   a=scanner(sf);
	if(a==22)   a=scanner(sf);		//此处需查表赋值
	while(a==23)
	{
		a=scanner(sf);
		if(a==21)	a=scanner(sf);
		if(a==38)   a=scanner(sf);
		if(a==22)   a=scanner(sf);	//此处需查表赋值
	}

	if(a==24)
		a=scanner(sf);
	else
		error(13);

	return a;
}

int vary(ifstream& sf,int a)	//此<变量定义>将书上的Backus表示法作了修改,更类似于<常量定义>的表示法
{
	a=IDT(sf,a);
	if(a==25)	a=scanner(sf);//:
	if(a==9)	a=scanner(sf);//integer 此处需填表
	while(a==23)//,
	{
		a=scanner(sf);
		a=IDT(sf,a);
		if(a==25)	a=scanner(sf);
		if(a==9)	a=scanner(sf);	//此处需填表
	}

	if(a==24)	
		a=scanner(sf);
	else
		error(13);

	return a;
}

int funcpro(ifstream& sf,int a)
{
	if(a==21)	a=scanner(sf);//标志符

	a=BLK(sf,a);

	if(a!=24)
		error(13);
	else
		a=scanner(sf);
	return a;
}

int CS(ifstream& sf,int a)
{
	a=sentence(sf,a);
	
	while(a==24)
	{
		a=scanner(sf);
		a=sentence(sf,a);
	}
	
	if(a!=6)
		error(7);
	else
		a=scanner(sf);

	return a;
}

int IDT(ifstream& sf,int a)//是否为标志符
{
	if(a==21)	a=scanner(sf);

	while(a==23)//,
	{
		a=scanner(sf);
		if(a==21)	
		a=scanner(sf);
	}

	return a;
}

int sentence(ifstream& sf,int a)
{
	switch(a)
	{
	case 21:	a=scanner(sf);
				if(a==44) a=scanner(sf);	//赋值语句
				a=E(sf,a);
				break;
	case 1:		a=scanner(sf);
				a=CS(sf,a);					//复合语句
				break;
	case 8:		a=scanner(sf);
				a=CE(sf,a);					//if语句
				
				if(a!=16)	
					error(3);
				else
					a=scanner(sf);

				a=sentence(sf,a);

				if(a==5)
				{
					a=scanner(sf);
					a=sentence(sf,a);
				}
				break;
	case 19:	a=scanner(sf);
				a=CE(sf,a);					//while语句
				
				if(a==4)
					a=scanner(sf);
				else
					error(4);

				a=sentence(sf,a);
				break;
	case 14:	a=scanner(sf);
				if(a==27)					//read语句
					a=scanner(sf);
				else
					error(0);

				a=IDT(sf,a);

				if(a==28)
					a=scanner(sf);
				else
					error(5);
				break;

	case 20:	a=scanner(sf);
				if(a==27)					//write语句
					a=scanner(sf);
				else
					error(0);

				a=ET(sf,a);

				if(a==28)
					a=scanner(sf);
				else
					error(5);
				break;
	default:	break;
	}

	return a;
}

int ET(ifstream& sf,int a)
{
		a=E(sf,a);
	while(a==23)
	{
		a=scanner(sf);
		a=E(sf,a);
	}

	return a;
}

int CE(ifstream& sf,int a)
{
	a=E(sf,a);
	
	while(a>=38&&a<=43)
	{
		a=scanner(sf);
		a=E(sf,a);
	}

	return a;
}


int E(ifstream& sf,int a)			//没有处理单目运算符
{
	a=T(sf,a);

	while(a==34||a==35)
	{
		a=scanner(sf);
		a=T(sf,a);
	}

	return a;
}

int T(ifstream& sf,int a)
{
	a=F(sf,a);

	while(a==3||a==36||a==37)
	{
		a=scanner(sf);
		a=F(sf,a);
	}

	return a;
}

int F(ifstream& sf,int a)				//因子文法没有改写
{
	switch(a)
	{
	case 21:	a=scanner(sf);
				if(a==27)
				{
					a=scanner(sf);
					a=ET(sf,a);
					
					if(a!=28)
						error(5);
					else
						a=scanner(sf);
					break;
				}else
					break;
	case 27:	a=scanner(sf);
				a=E(sf,a);
					
				if(a!=28)
					error(5);
				else
					a=scanner(sf);

				break;
	case 22:	a=scanner(sf);
				break;
	}

	return a;
}
	

⌨️ 快捷键说明

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