编译原理实验3-算符优先分析法

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#define SIZE 128
char priority[6][6];  //算符优先关系表数组
char input[SIZE];     //存放输入的要进行分析的句子
char remain[SIZE];    //存放剩余串
char AnalyseStack[SIZE];  //分析栈
void analyse();
int  testchar(char x);  //判断字符X在算符优先关系表中的位置
void remainString();    //移进时处理剩余字符串,即去掉剩余字符串第一个字符
int k;
void init()//构造算符优先关系表,并将其存入数组中
{
	priority[1][0]='>';
	priority[1][1]='>';
	priority[1][2]='<';
	priority[1][3]='<';
	priority[1][4]='>';
	priority[1][5]='>';

	priority[2][0]='>';
	priority[2][1]='>';
	priority[2][2]='$';//无优先关系的用$表示
	priority[2][3]='$';
	priority[2][4]='>';
	priority[2][5]='>';

	priority[3][0]='<';
	priority[3][1]='<';
	priority[3][2]='<';
	priority[3][3]='<';
	priority[3][4]='=';
	priority[3][5]='$';

	priority[4][0]='>';
	priority[4][1]='>';
	priority[4][2]='$';
	priority[4][3]='$';
	priority[4][4]='>';
	priority[4][5]='>';

	priority[5][0]='<';
	priority[5][1]='<';
	priority[5][2]='<';
	priority[5][3]='<';
	priority[5][4]='$';
	priority[5][5]='=';
}
void analyse()//对所输入的句子进行算符优先分析过程的函数
{
	int i,j,f,z,z1,n,n1,z2,n2;
	int count=0;//操作的步骤数
	char a; //用于存放正在分析的字符
	char p,Q,p1,p2;
	f=strlen(input);  //测出数组的长度
	for(i=0;i<=f;i++)
	{
		a=input[i];
		if(i==0)
			remainString();
		if(AnalyseStack[k]=='+'||AnalyseStack[k]=='*'||AnalyseStack[k]=='i'
     ||AnalyseStack[k]=='('||AnalyseStack[k]==')'||AnalyseStack[k]=='#')
			j=k;
		else
			j=k-1;
		z=testchar(AnalyseStack[j]);//从优先关系表中查出s[j]和a的优先关系
		if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#')
			n=testchar(a);
		else //如果句子含有不是终结符集合里的其它字符,不合法
		{
			printf("错误!该句子不是该文法的合法句子!\n");
			break;
		}
		p=priority[z][n];
		if(p=='$')
		{
			printf("错误!该句子不是该文法的合法句子!\n");
			return;
		}
		if(p=='>')
	{ for( ; ; )
		{
        Q=AnalyseStack[j];
			 if(AnalyseStack[j-1]=='+'||AnalyseStack[j-1]=='*'||AnalyseStack[j-1]=='i'
       ||AnalyseStack[j-1]=='('||AnalyseStack[j-1]==')'||AnalyseStack[j-1]=='#')
				 j=j-1;
			 else
				 j=j-2;
			 z1=testchar(AnalyseStack[j]);
			 n1=testchar(Q);
			 p1=priority[z1][n1];
			 if(p1=='<')  //把AnalyseStack[j+1]~AnalyseStack[k]归约为N
			 {
				 count++;
				 printf("(%d)     %s\t%10c\t%5c%17s\t    归约\n",count,AnalyseStack,p,a,remain);
				 k=j+1;
				 i--;
				 AnalyseStack[k]='N';
				 int r,r1;
				 r=strlen(AnalyseStack);
				 for(r1=k+1;r1<r;r1++)
					 AnalyseStack[r1]='\0';
			 break;
			 }
			 else
			   continue;
		}
	}
		else
		{
			if(p=='<')  //表示移进
			{
				count++;
				printf("(%d)     %s\t%10c\t%5c%17s\t    移进\n",count,AnalyseStack,p,a,remain);
				k=k+1;
				AnalyseStack[k]=a;
				remainString();
			}
			else
			{
				if(p=='=')
				{
					z2=testchar(AnalyseStack[j]);
					n2=testchar('#');
					p2=priority[z2][n2];
					if(p2=='=')
					{
						count++;
						printf("(%d)     %s\t%10c\t%5c%17s\t    接受\n",count,AnalyseStack,p,a,remain);
						printf("该句子是该文法的合法句子。\n");
						break;
					}
					else
					{
						count++;
						printf("(%d)     %s\t%10c\t%5c%17s\t    移进\n",count,AnalyseStack,p,a,remain);
						k=k+1;
						AnalyseStack[k]=a;
						remainString();
					}
				}
				else
				{
					printf("错误!该句子不是该文法的合法句子!\n");
					break;
				}
			}
		}
	}
}

int testchar(char x)
{
	int m;
	if(x=='+')
		m=0;
	if(x=='*')
		m=1;
	if(x=='i')
		m=2;
	if(x=='(')
		m=3;
	if(x==')')
		m=4;
	if(x=='#')
		m=5;
	return m;
}
void remainString()
{
	int i,j;
	i=strlen(remain);
	for(j=0;j<i;j++)
		remain[j]=remain[j+1];
	remain[i-1]='\0';
}

int main()
{
	init();
	printf("请输入要进行分析的句子(以#号结束输入):\n");
    gets(input);//将输入的字符串存到数组中
	printf("步骤    栈           优先关系    当前符号    剩余输入串   移进或归约\n");
	k=0;
	AnalyseStack[k]='#';
	AnalyseStack[k+1]='\0';
	int length,i; //初始化剩余字符串数组为输入串
	length=strlen(input);//
	for(i=0;i<length;i++)
		remain[i]=input[i];
	remain[i]='\0';
	analyse();//对所输入的句子进行算符优先分析过程的函数
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值