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

📄 1.cpp

📁 编译原理练习源代码:语法分析 开发环境VC
💻 CPP
字号:
/************************************语法分析********************************/
//备注:输入以#结束,且不可分行输入!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h>

char prog[80],token[8];
char ch;
int syn,p,m,n,sum;					//syn为单词种别码,p是缓冲区prog的指针,m是token的指针,sum为数字
char *rwtab[6]={"begin","if","then","while","do","end"};

void scanner();
void lrparser();
void yucu();
void statement();
void factor();
void expression();
void term();
void factor();
int f=0;

void main()
{
	p=0;
	cout<<"请输入语句:\n";
	while(ch!='#')
	{
	cin.get(ch);
	prog[p++]=ch;
	}
	p=0;
	scanner();
	lrparser();
}

void error()
{
	cout<<"Error!\n";
}
void scanner()
{
	for(n=0;n<8;n++)
		token[n]=NULL;
	m=0;
	sum=0;
	ch=prog[p++];
	while(ch==' ')
		ch=prog[p++];
	if((ch>='A'&&ch<='Z')||(ch>='a' && ch<='z'))
	{
		while((ch>='A'&&ch<='Z')||(ch>='a' && ch<='z')||(ch>='0' && ch<='9'))
		{
			token[m++]=ch;
			ch=prog[p++];
		}
		token[m++]='\0';
		p--;
		syn=10;
		for(n=0;n<6;n++)
			if(strcmp(token,rwtab[n])==0)
			{	
				syn=n+1;
				break;
			}
	}
	else
		if(ch>='0'&&ch<='9')
		{
			while(ch>='0'&&ch<='9')
			{
				sum=sum*10+(int)(ch-'0');
				ch=prog[p++];
			}
			p--;
			syn=11;
	
		}
	else
		switch(ch)
	{
		case '+':syn=13;break;
		case '-':syn=14;break;
		case '*':syn=15;break;
		case '/':syn=16;break;		
		case ':':m=0;token[m++]=ch;ch=prog[p++];
			if(ch=='=')
			{
				syn=18;
			}
			else 
			{
				syn=17;
				p--;
			}
			break;
		case '<':m=0;token[m++]=ch;ch=prog[p++];
			if(ch=='>')
			{
				syn=21;
	
			}
			else if(ch=='=')
			{
				syn=22;
			}
			else
			{
				p--;
				syn=20;
			}
			break;
		case '>':m=0;token[m++]=ch;ch=prog[p++];
			if(ch=='=')
			{
				syn=24;
			}
			else
			{
				p--;
				syn=23;
			}
			break;
		case '=':syn=25;break;
		case ';':syn=26;break;
		case '(':syn=27;break;
		case ')':syn=28;break;
		case '#':syn=0;break;		
		default: syn=-1;error();break;
	}
}


void lrparser()
{
	if(syn==1)
	{
		scanner();
		yucu();
		{
			if(syn==6)
			{
				scanner();
				if(syn==0 && (f==0))
					cout<<"success!"<<endl;
			}
		
			else 
				{
					if(f!=1)
					{
						error();
						f=1;
					}
					
				}
		}
	}
	else
		{
			error();
			f=1;
		}	
}
void yucu()
{
	statement();
	while(syn==26)
	{
		scanner();
		statement();
	}
}

void statement()
{
	if(syn==10)
	{
		scanner();
		if(syn==18)
		{
			scanner();
			expression();
		}
		else
		{
			error();
			f=1;
		}
	}
	else
		{
			error();
			f=1;
		}
}

void expression()
{
	term();
	while(syn==13||syn==14)
	{
		scanner();
		term();
	}
}
void term()
{
	factor();
	if(syn==15||syn==16)
	{
		scanner();
		factor();
	}
}
void factor()
{
	if(syn==10||syn==11)
		scanner();
	else if(syn==27)
	{
		scanner();
		expression();
		if(syn==28)
		scanner();
		else 
		{
			error();
			f=1;
		}
	}
	else
	{
		error();
		f=1;
	}
}


⌨️ 快捷键说明

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