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

📄 table.cpp

📁 编译原理课程实验要求做的语法分析
💻 CPP
字号:
#include"bianyi.h"
#define  N 21
#define M 50
#define SIZE 36



struct nmdzb_type          //内码对照表的数组
{ 
	int  stringsnb;
    char strings[20];
}nmb[SIZE]={{0," "},{1," "},{2," "},{3,"PROGRAM"},{4,"CONST"},{5,"VAR"},{6,"INTEGER"},{7,"LONG"},
            {8,"PROCEDURE"},{9,"IF"},{10,"THEN"},{11,"WHILE"},{12,"DO"},
            {13,"READ"},{14,"WRITE"},{15,"BEGIN"},{16,"END"},{17,"ODD"},
            {18,"+"},{19,"-"},{20,"*"},{21,"/"},{22,"="},
            {23,"<>"},{24,"<"},{25,"<="},{26,">"},{27,">="},
            {28,"."},{29,","},{30,";"},{31,":"},{32,":="},
            {33,"("},{34,")"},{35,"$"}};



struct Word * getsym()
{
	FILE *fpr;
	fpr=fopen("e:\\table.txt","r");
    
	if(!fpr)                                 //若无法打开文件
	{
		printf("CAN'T read!\n");
		return 0;
	}
	cout<<"//////////////////////////////////词法分析////////////////////////////////////"<<endl;


	int Row(1);
	int arrage(1);
	int i=0;
	int j=0;
	int flag=1;
	char str[N];
	struct Word *word,*Cptr,*Eptr,*Hptr;
	Cptr=Eptr=Hptr=NULL;

	word=(struct Word*)(malloc(sizeof( Word)));
	word->next=NULL;

	char ch;
	

    //struct Word *p;
	                                                  //for语句 使table的每个[],赋值 date为i,next为null
	ch=fgetc(fpr);
	while(ch!=EOF)
	{
		
		if(ch==' ')
		{
			arrage++;
        	ch=fgetc(fpr);
			continue;
		}//if                                                  //if,判断是否是空格

		if(ch=='\n')
		{
			Row++;
			arrage=1;
			ch=fgetc(fpr);
			continue;
		}//if                                                   //if  判断是否是回车


		if(isalpha(ch))
		{
			i=0;
			while(isalnum(ch)&&i<20)
			{
				str[i]=ch;
				ch=fgetc(fpr);
				
					i++;
			}//while                                            //while,接受字母开头的保留字或表识符

			if(i<20&&!isalnum(ch))
			{

				str[i]='\0';
				word->row=Row;
				word->arrage=arrage;
				arrage+=i;
			
				j=3;
				flag=1;

				while(j<=17&&flag!=0)
				{
					flag=strcmp(str,nmb[j].strings);
				
					if(flag!=0)
						j++;
				}//while                                         //while   根据接收的字符串 查找内码表

				if(flag)
					j=2;
				word->Ltrace=j;
				if(!Hptr)
					Cptr=Hptr=word;        //if    如果是保留字
				else
				{
					word->next=NULL;
					Cptr->next=word;
					Cptr=Cptr->next;
				}//else                                         //else    表识符
			}

			else
			{
				str[i]='\0';
			    word->row=Row;
				word->arrage=arrage;
				arrage+=i;
				word->Ltrace=2;
				if(!Hptr)
					Cptr=Hptr=word;        //if    如果是保留字
				else
				{
					word->next=NULL;
					Cptr->next=word;
					Cptr=Cptr->next;
				}//else         
				
			}
            word=(struct Word*)(malloc(sizeof( Word)));
			word->next=NULL;	

				

		}//if                                                //if    字母开头的字符串

	



        else
		{
		    if(isdigit(ch))                                  //若为 数字
			{
			    for(i=0;i<=19;i++)
				{
				  str[i]='\0';
				}//for                                       //for  在word—date中赋值均为  “|0”
			  
			    i=0;
			    
			   while(isalnum(ch))
			  {
				  str[i]=ch;
				  ch=fgetc(fpr);
				 
					  i++;
				 
			  }//while                                     //while   word-data中输入数字

			  //是否要考虑 123YUIU这种情况?
              
			  word->row=Row;
			  word->arrage=arrage;
			  word->Ltrace=1;
			  arrage+=i;
			  if(!Hptr)
					Cptr=Hptr=word;        //if    如果是保留字
				else
				{
					word->next=NULL;
					Cptr->next=word;
					Cptr=Cptr->next;
				}//else         

			  word=(struct Word*)(malloc(sizeof(Word)));
			  word->next=NULL;

			}//if                                             //IF         
		
		  else                                               //可能为 单或双字符
		  {
                  i=0;
				  str[i]=ch;
				  ch=fgetc(fpr);
				  i++;
				  
				  if(isspace(ch))
					  str[i]='\0';                         //单字符
				  
				  else
				  {
                      str[i]=ch;
					  i++;
					  str[i]='\0';
				  }//else                                   //else   双字符
					 
				  
					                                        //先忽略》899诸如此类的EROOR

					  j=18;
					  flag=1;
					  while(j<SIZE&&flag!=0&&ch!=EOF)
					  {
						  flag=strcmp(str,nmb[j].strings);
						  if(flag)
							  j++;
					  }//while                                  //while   查找内码
					  if(flag==0)
					  {
					      word->row=Row;
						  word->arrage=arrage;
						  arrage+=i-1;///////////////////////////////////////////////////////
						  word->Ltrace=j;
					      if(!Hptr)
							  Hptr=Cptr=word;
						  else
						  {
							  word->next=NULL;
							  Cptr->next=word;
							  Cptr=Cptr->next;
						  }
						  if(i==2)
							  ch=fgetc(fpr);
					  }//if

					  else
					  {
						  if(!isspace(ch))
						  {
							  str[1]='\0';
							  j=18;
					          flag=1;
					          i=0;
					          while(j<SIZE&&flag!=0)
							  {
								  flag=strcmp(str,nmb[j].strings);
								  if(flag)
									  j++;
								  
							  }//while 
                            }

							  if(flag==0)
							  {
					     
						  		  word->row=Row;
						  		
					              word->arrage=arrage;
								  arrage+=i+1;
								  word->Ltrace=j;
								  if(!Hptr)
									  Hptr=Cptr=word;
								  else
								  {
									  word->next=NULL;
							          Cptr->next=word;
							          Cptr=Cptr->next;
								  }
								  
					             
							  }//if
						  else
						  {
							
							  word->row=Row;
							  word->arrage=arrage;
							  if(!isspace(ch)||flag!=0)
								  arrage+=i;
								else 
									arrage+=i-1;
								if(!Eptr)
								{
									  Eptr=word;
									  Eptr->next=NULL;
								}
								  else
								  {
									  word->next=Eptr;
							          Eptr=word;
							          
								  }
					          
						  }
                       
					  }//if




                      word=( struct Word*)(malloc(sizeof(Word)));
					  word->next=NULL;
					  

		  }//else                                             
		
		}//else

		


		}//whlie

		fclose(fpr);
		if(Eptr)
		{
			while(Eptr!=NULL)
			{
				cout<<Eptr->row<<"行   "<<Eptr->arrage<<"列   "<<"存在词法错误"<<endl;
				word=Eptr;
				Eptr=Eptr->next;
				free(word);
			}
			return NULL;

			
		
		}
		else
		{
		    cout<<"不存在词法错误,进入语法分析"<<endl<<endl;	
			return Hptr;
			
		}
		

}//子程序
		  
			
	
		


⌨️ 快捷键说明

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