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

📄 cpp2.cpp

📁 编译原理 语法分析 分析begin u:=0 end #
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
char prog[80],token[8], ch;
int syn,p,m,n,sum, kk=0;
char *rwtab[6]={"begin", "if", "then", "while", "do", "end"};
int scaner();
void lrparser();
void yucu();
void statement();
void expression();
void term();
void factor();
void main()
{   
	p=0;
	printf("\n请输入字符串:\n");
	do
	{
		scanf("%c",&ch);
		prog[p]=ch;
		p=p++;
	}
	while(ch!='#');
		p=0;
		printf("\n输出:");
	    scaner();
		lrparser();	
}

int scaner()
{
	m=0;
	for(n=0;n<8;n++)
	token[n]=NULL;
	ch=prog[p++];
	while(ch==' ')
	ch=prog[p++];
	if(ch>='a'&&ch<='z')
		{
			while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9')
			{
			token[m++]=ch;
		    ch=prog[p++];
			}
			token[m++]='\0';
			p=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=ch-'0';
					ch=prog[p++];
				}
				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=p--;
							}
						break;
			case '>':token[m++]=ch;
					 ch=prog[p++];
						if(ch=='=')
						{
							syn=24;
							token[m++]=ch;}
						else
						{
							syn=23;
						    p=p--;
						}
						break;
			case ':':token[m++]=ch;
                     ch=prog[p++];
						if(ch=='=')
							{
							syn=18;
							token[m++]=ch;
						}
						else
						{
							syn=17;
							p=p--;
						}
						break;
			case '+':syn=13;token[m++]=ch;break;
			case '-':syn=14;token[m++]=ch;break;
			case '*':syn=15;token[m++]=ch;break;
			case '/':syn=16;token[m++]=ch;break;
			case '(':syn=27;token[m++]=ch;break;
			case ')':syn=28;token[m++]=ch;break;
			case ';':syn=26;token[m++]=ch;break;
			case '#':syn=0;token[m++]=ch;break;
			default:syn=-1;
}
		return syn;
}

void lrparser()
{
	if(syn==1)
	{  
		scaner();
		yucu();
		if (syn==6)
		{
			scaner();
			if(syn==0&&kk==0)
			printf("编译成功");
		}
		else
		{
			if(kk!=1)
			printf("缺end");
			kk=1;
		}
	}
	else
	{   printf("'begin'错误");kk=1;  }
		return;
}

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

		}
	return;
}

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

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

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

void factor()
{
	if(syn==10||syn==11)
	scaner();
	else if(syn==27)
		{
			scaner();
			expression();
			if(syn==28)
			{	
				scaner();
			}
			else{	printf("输出')'错误");kk=1;}
	}
	else
	{
		printf("输出表达式错误");
		kk=1;
	}
	return;
}

⌨️ 快捷键说明

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