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

📄 first.cpp

📁 编译原理课程实验要求做的语法分析
💻 CPP
字号:
#include"bianyi.h"
void Rfirst(bool First[][36],const int Ruleright[][7],const int Link[][8])
{
	SqStack Sqstack;
	InitStack(Sqstack);
	int Ltrace(0),Rtrace(0),Fitrace(0);
	int Lptr(0),Rptr(0),Fiptr(1);
	int flag;
	
	while(Ltrace<=33)
	{
		////////////////////////
		Rpush(Ltrace+128,0,Sqstack);
		
		while(!Rempty(Sqstack))
		{
			Lptr=(Sqstack.top-1)->Lptr;
			Rtrace=Link[Ltrace][Lptr];
			while(Rtrace!=-1)//////这里也要保存liptr!!! 
			{/////////////////////////////////////////////////////////////////////
				if(Ruleright[Rtrace][0]>=128)
				{
						Rpush(Ruleright[Rtrace][0],0,Sqstack);
					    Ltrace=Ruleright[Rtrace][0]-128;
						Rtrace=Link[Ltrace][0];
						
					    Lptr=0;
				}

				else
				{
					if(Ruleright[Rtrace][0]>0)
					{
						Rpop(Ltrace,Lptr,Sqstack);
						Ltrace-=128;
						
						First[Ltrace][Ruleright[Rtrace][0]]=1;
						Lptr++;
						Rpush(Ltrace+128,Lptr,Sqstack);
						Rtrace=Link[Ltrace][Lptr];
						
						
					}
					else
					{
						if(Ruleright[Rtrace][0]==0)
						{
							Rpop(Ltrace,Lptr,Sqstack);
						    Lptr++;
						    Rpush(Ltrace,Lptr,Sqstack);
						    Rtrace=Link[Ltrace-128][Lptr];
							
						}
					}
				}
			}
			Rpop(Ltrace,Lptr,Sqstack);
			Ltrace-=128;
			if(!Rempty(Sqstack))
			{
				Rpop(Ltrace,Lptr,Sqstack);
				Ltrace-=128;
				Rtrace=Link[Ltrace][Lptr];
				while(Fiptr<=35)                        ////////////////////////Fiptr  的初值
				{
					if(First[Ruleright[Rtrace][0]-128][Fiptr]==1)//////////////////////出现FIPTR
						First[Ltrace][Fiptr]=1;
					Fiptr++;
				}
				Lptr++;
				Rpush(Ltrace+128,Lptr,Sqstack);
				Fiptr=0;
			}///(5)
		}//(3)

		Ltrace++;
	}//(2)


	Lptr=0;
	Ltrace=0;
	flag=0;

	while(!flag)//////////////////////////////(6)
	{
		flag=1;
		
		while(Ltrace<=33)
		{                 //////////////////////(7)
			Rptr=0;
			Lptr=0;

			while(Link[Ltrace][Lptr]!=-1&&Link[Ltrace][Lptr]!=4)
			{            //////////////////////////(8)
				Rtrace=Link[Ltrace][Lptr];
				Rptr=0;
				while(Ruleright[Rtrace][Rptr]>=128)
				{          ///////////////////////////////////////////////(9)
					Rpush(Ltrace+128,Lptr,Sqstack);
					Ltrace=Ruleright[Rtrace][Rptr]-128;
					Lptr=0;
					while(Link[Ltrace][Lptr]!=-1&&Link[Ltrace][Lptr]!=4)
						Lptr++;

					if(Link[Ltrace][Lptr]==4||First[Ltrace][0]==1)
					{          //////////////////(10)
						Rpop(Ltrace,Lptr,Sqstack);
						Ltrace-=128;
						Rptr++;
						Fiptr=1;
						Rtrace=Link[Ltrace][Lptr];

						if(Ruleright[Rtrace][Rptr]>=128)
						{                //////////////////////////////(11)
							while(Fiptr<=35)
							{
								if(First[Ruleright[Rtrace][Rptr]-128][Fiptr]==1)
								{
									if(First[Ltrace][Fiptr]!=1)
									{
										First[Ltrace][Fiptr]=1;
										flag=0;
									}
									
								}
								Fiptr++;
							}

							}///////////////////(11)

							else
							{
								if((Ruleright[Rtrace][Rptr]>0)&&(First[Ltrace][Ruleright[Rtrace][Rptr]]!=1))
									{
										First[Ltrace][Ruleright[Rtrace][Rptr]]=1;
										flag=0;
									}

								if(Ruleright[Rtrace][Rptr]==0&&First[Ltrace][0]!=1)
								{
									flag=0;
									First[Ltrace][0]=1;
								}
							}
						}///////////////////////////////////////////(10)

						else
						{
							Rpop(Ltrace,Lptr,Sqstack);
							Ltrace-=128;
						
							break;

						}
					}//////////////////////(9)

					Lptr++;
				}////////////////////////////////(8)

				Rtrace=Link[Ltrace][Lptr];

				if(Rtrace==4&&First[Ltrace][0]==0)
				{
					First[Ltrace][0]=1;
					flag=0;
				}

				Ltrace++;

			}////////////////(7)

		}////////////////////////(6)



}

⌨️ 快捷键说明

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