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

📄 zz.txt

📁 IF-ELSE条件语句的语法分析及语义分析程序设计
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    go_to[25][2]=32;
    go_to[25][3]=10;
    go_to[26][2]=33;
    go_to[26][3]=10;
    go_to[31][5]=34;
    go_to[35][4]=36;
    go_to[36][1]=37;
     
      stack_count=0;
        stack_count_word=0;
     stack[stack_count].num=0;
     stack[stack_count_word].word[1]='#';
   

    //printf("%d,%d,%c\n",stack[stack_count].num,stack_count,stack[stack_count_word].word[1]); 
}



int chartoint(char ch)/*按go_to表给非终结符编号*/
{
    int j;
    j=-1;
    if(ch=='i') j=0;   /* if查找 */
    if(ch=='(') j=1;
    if(ch==')') j=2;
    if(ch=='e') j=3;   /*else 查找*/
    if(ch=='=') j=4;
    if(ch=='&') j=5;
    if(ch=='|') j=6;
    if(ch=='!')  j=7;
    if(ch=='<'||ch=='>') j=8;   /*relop*/
    if(ch=='+') j=9;
    if(ch=='*') j=10;
    if(ch=='-') j=11;
    if(ch=='a'||ch=='b'||ch=='c'||ch=='d'||ch=='m') j=12;
    if(ch=='#') j=13;
    return(j);
}

int chartoint_fzj(char ch)/*按go_to表给非终结符编号*/
{
    int j;
    j=-1;
    if(ch=='P') j=0;   /* if查找 */
    if(ch=='S') j=1;
    if(ch=='B') j=2;
    if(ch=='E') j=3;   /*else 查找*/
    if(ch=='M') j=4;
    if(ch=='N') j=5;
    return(j);
}
void cifa()
{
 char str;
 int zong_i=-1;
 if ((fp=fopen("源程序.txt","r"))==NULL)
        printf("源程序无法打开!\n");
      else
	  {     str =fgetc(fp);
               while (str!=EOF)
                { if(str!=' ') ++zong_i;
                  else {str=fgetc(fp);continue;}
                  if (str=='>'||str=='<'||str=='+'||str=='-'||str=='='||str=='*'||str=='('||str==')')
                      {    int i=-1;
                         zong[zong_i].zifu[++i]=str;
                         zong[zong_i].zifu[i+1]='\0';
                        /*  printf("%s,%d\n",zong[zong_i].zifu,zong_i); */
                         str=fgetc(fp);
                      }
                else 
                 { if(isalpha(str)!=0)          /* 字符的处理 */
                      { int i=-1;
                            while (isalnum(str)!=0)
                            {
                                zong[zong_i].zifu[++i]=str;
                                str=fgetc(fp);
                            } 
                              
                              zong[zong_i].zifu[i+1]='\0';
                             /*  printf("%s,%d\n",zong[zong_i].zifu,zong_i); */
                              
                        }
                   else                         /* 数字处理 */
                    { int i=-1;
                      while (isdigit(str)!=0)
                        {
                          zong[zong_i].zifu[++i]=str;
                          str=fgetc(fp);
                        }
                       zong[zong_i].zifu[i+1]='\0';
                      /*  printf("%s,%d\n",zong[zong_i].zifu,zong_i); */
                     }
                }
                }
      }
         zong[++zong_i].zifu[0]='#';
         zong[zong_i].zifu[1]='\0';

}

char action_cha(int stack_i,int action_i)
{
    return action[stack_i][action_i].sr;
}
int goto_cha(int stack_i,int goto_i)
{
    return go_to[stack_i][goto_i];
}
void yiji(int i)
{
if(zong[i].zifu[0]=='a'||zong[i].zifu[0]=='b'||zong[i].zifu[0]=='c'||zong[i].zifu[0]=='d'||zong[i].zifu[0]=='m')
		 {
			stack[++stack_count_word].word[0]='i';
            //printf("%s,%s\n",stack[stack_count_word].word,zong[i].zifu); 
		    stack[++stack_count].num=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
            //printf("%d\n",stack[stack_count].num);   
		 }
else if(zong[i].zifu[0]=='>'||zong[i].zifu[0]=='<')
{
	        stack[++stack_count_word].word[0]='r';
            printf("%s,%s\n",stack[stack_count_word].word,zong[i].zifu); 
		    stack[++stack_count].num=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
            printf("%d\n",stack[stack_count].num);
} 
    else
		 {  strcpy(stack[++stack_count_word].word,zong[i].zifu);
            printf("%s,%s\n",stack[stack_count_word].word,zong[i].zifu); 
		    stack[++stack_count].num=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
            printf("%d\n",stack[stack_count].num); 
	}
}
int guiyue(int i)
{   
    if(ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len==1)
	{     
		if(0==memcmp("$",ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right,1)||0==memcmp(stack[stack_count_word].word,ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right,1))
		{  
		  if(ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right[0]=='$')
		  {
         
		   stack[++stack_count_word].word[0]=ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].left;
           stack[++stack_count].num=goto_cha(stack[stack_count].num,chartoint_fzj(stack[stack_count_word].word[0]));
            return 1;
		  }
		  else
		  {
           printf("%d\n",action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state);
		   stack[stack_count_word-ge[stack[stack_count].num].len+1].word[0]=ge[stack[stack_count].num].left;
           printf("%c\n", stack[stack_count_word-ge[stack[stack_count].num].len].word[0]);
           stack_count_word=stack_count_word-ge[stack[stack_count].num].len+1;
           printf("%d\n", stack_count_word);
           stack[stack_count].num=goto_cha(stack[stack_count-1].num,chartoint_fzj(stack[stack_count_word-ge[stack[stack_count].num].len+1].word[0]));
           printf("%d\n", stack[stack_count].num);
		   return 1;
		  }
		}
		else return 0;
	}
	else
	 { int  fanhui,j,f; 
	   int test1=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
	   int zifuchangdu=ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len;
	   char test[20];
	   for(j=zifuchangdu,f=0;j>0;j--,f++)
	   {  
		   test[f]=stack[stack_count_word+1-j].word[0];
		   printf("%c",test[f]);
	   }  
       if(0==memcmp(test,ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right,zifuchangdu))
		  {   
			  int test=stack_count_word-ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len;
			  stack[test+1].word[0]=ge[test1].left;  
              stack_count_word=stack_count-ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len+1;
              stack[stack_count-zifuchangdu+1].num=goto_cha(stack[stack_count-zifuchangdu].num,chartoint_fzj(stack[stack_count-zifuchangdu+1].word[0]));
			  stack_count= stack_count-zifuchangdu+1;
			  fanhui=1 ;
		  } 
	     else {printf("语法错误!\n"); fanhui=0 ;}
		  
		  return fanhui;
	 }
	    
  	    
}

void  yufa()
{  
       /*int j=chartoint(zong[0].zifu[0]);
       printf("%d,%d,%d\n",j,stack[stack_count].num,stack_count); */
 for(int i=0;i<20;i++)
 {   if('#'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
		 {
		        printf("succes\n");
		 }
       else if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
	   {    
	      yiji(i);
       }
	 else if('r'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
	 {    
		 int panduan=guiyue(i);
		 if(panduan==1)
		 {
             if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
				yiji(i);
			 else 
			 {
				 guiyue(i);
                 if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
				        yiji(i);
				 else  
				 {
					 guiyue(i);
                     if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
				                 yiji(i);
				         else  guiyue(i);
				 
				 }
			 }
		 }
		 else break;
	}
	 else
	 { 
		   printf("语法错误!"); break;
	 }
 }

}

void main()
{   
    creatTable();
   
    cifa();    
    yufa();

   for(int i=0;i<20;i++)
    {
        printf("%s\n",zong[i].zifu);
    }
    
}

⌨️ 快捷键说明

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