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

📄 if_thenyufafenxi.cpp

📁 编译原理课程设计If_then语法分析源代码
💻 CPP
字号:
#include<stdio.h>//定义I/O库所用的某些宏和变量
#include<string.h>//定义字符串库函数
#include<iostream.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,kk;//p是缓冲区prog的指针,m是token的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
char *RWTAB[6]={"BEGIN","IF","THEN","WHILE","DO","END"};
void Irparser();
void yucu();
void statement();
void expression();
void term();
void factor();
int scaner()
{
	for(n=0;n<8;n++)
	token[n]=NULL;
	sum='\0';
	ch=prog[p++];//读下一个字符;
	while(ch==' '||ch=='\n')ch=prog[p++];//读下一个字符;
	m=0;
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//(ch是字,母字符)
	{
		while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))//(ch为字母字符或数字字符)
		{
			token[m]=ch;
			m++;//ch→token;
			ch=prog[p++];//读下一个字符;
		}
		p--;//回退一个字符;
		token[m++]='\0';
		syn=10;
		for(n=0;n<6;n++)
			if(strcmp(token,rwtab[n])==0)
			{
				syn=n+1;
			    break;
			}//给出syn值;
		if(syn==10)
			for(n=0;n<6;n++)
				if(strcmp(token,RWTAB[n])==0)
				{
					syn=n+1;
					break;
				}//给出syn值;
	}
	else
		if(ch>='0'&&ch<='9')//(ch是数字字符)
		{
			while(ch>='0'&&ch<='9')//(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 '>':token[m++]=ch;//ch→token;
			    ch=prog[p++];//读下一个字符;
				if(ch=='=')
				{
					syn=24;//将>=的种别码→syn;
					token[m++]=ch;//ch→token;
				}
				else
				{
					syn=23;//将>的种别码→syn;
					p--;//回退一个字符;
				}
				break;
		case ':':token[m++]=ch;//ch→token;
			    ch=prog[p++];//读下一个字符;
				if(ch=='=')
				{
					syn=18;//将:=的种别码→syn;
					token[m++]=ch;//ch→token;
				}
				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;
	}
	return syn;
}
void Irparser()
{
	if(syn==2)
	{
		scaner();//读下一个单词符号;
		yucu();//调用yucu函数;
		if(syn==3)
		{
			scaner();//读下一个单词符号;
			yucu();
			if(syn==0&&kk==0)
				cout<<"success"<<endl;//输出("success");
		}
		else
		{
			if(kk!=1)
				cout<<"缺then"<<endl;//输出'缺end'错误;
			kk=1;
		}
	}
	else
	{
		cout<<"if错误"<<endl;//输出'begin'错误;
		kk=1;
	}
	return;
}
void yucu()
{
	statement();//调用statement函数;
	while(syn==26)
	{
		scaner();//读下一个单词符号;
		statement();//调用statement函数;
	}
	return;
}
void statement()
{
	if(syn==10)
	{
		scaner();//读下一个单词符号;
		if(syn==18)
		{
			scaner();//读下一个单词符号;
			expression();//调用expression函数;
		}
		else if(syn==20||syn==22||syn==23||syn==24){scaner();if(syn!=10&&syn!=11)cout<<"if 表达式错误!"<<endl;else factor();}
		else 
		{
			cout<<"赋值号错误"<<endl;//输出赋值号错误;
			kk=1;
		}
	}
	else 
	{
		cout<<"语句错误"<<endl;//输出语句错误;
		kk=1;
	}
	return;
}
void expression()
{
	term();//调用term函数;
	while(syn==13||syn==14)
	{
		scaner();//读下一个单词符号;
		term();//调用term函数;
	}
	return;
}
void term()
{
	factor();//调用factor函数;
	while(syn==15||syn==16)
	{
		scaner();//读下一个单词符号;
		factor();//调用factor函数;
	}
	return;
}
void factor()
{
	if(syn==10||syn==11)
		scaner();//读下一个单词符号;
	else if(syn==27)
	{
		scaner();//读下一个单词符号;
		expression();//调用expression函数;
		if(syn==28)
			scaner();//读下一个单词符号;
		else
		{
			cout<<"')'错误"<<endl;//输出')'错误;
			kk=1;
		}
	}
	else
	{
		cout<<"表达式错误"<<endl;//输出表达式错误;
		kk=1;
	}
	return;
}
void main()
{
   cout<<"*************IF THEN 条件语句的语法分析*************\n";
	int i=1;
	char j;
	while(i)
	{
		p=-1;
	    cout<<"please input a string:"<<endl;
	    do
		{
			prog[p++]=ch;//输入源程序字符串,送到缓冲区prog[p++]中;
		}while((ch=getchar())!='#');
    	prog[p]='#';
	    p=0;
	    scaner();
	    Irparser();
		cout<<"是否继续?(Y/N):";
		cin>>j;
		cout<<endl;
		if(j=='n'||j=='N')i=0;
	}
	cout<<"Byebye! ^_^\n";
}

⌨️ 快捷键说明

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