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

📄

📁 这是一个词法分析器
💻
📖 第 1 页 / 共 2 页
字号:
   }
   if((lr1<10)&&(lr1>=0))
   {
      sp1++;
      stack1[sp1]=lr1;
      if(n1.syl!=tempsy)
      {
	 ssp++;
	 num++;
	 sstack[ssp].syl=n1.syl;
	 sstack[ssp].pos=n1.pos;
      }
      n1.syl=ibuf[num].syl;
      n1.pos=ibuf[num].pos;
      lrparse1(num);
   }
   if((lr1>=100)&&(lr1<105))
   {
      switch(lr1)
      {
	case 100: break;
	case 101:
		  E.pos=newtemp();
		  gen("+",sstack[ssp-2],sstack[ssp],E.pos+100);
		  ssp=ssp-2;
		  sstack[ssp].syl=tempsy;
		  sstack[ssp].pos=E.pos;
		  sp1=sp1-3;
		  break;
	case 102:
		  E.pos=newtemp();
		  gen("*",sstack[ssp-2],sstack[ssp],E.pos+100);
		  ssp=ssp-2;
		  sstack[ssp].syl=tempsy;
		  sstack[ssp].pos=E.pos;
		  sp1=sp1-3;
		  break;
	case 103:
		  E.pos=sstack[ssp-1].pos;
		  ssp=ssp-2;
		  sstack[ssp].syl=tempsy;
		  sstack[ssp].pos=E.pos;
		  sp1=sp1-3;
		  break;
	case 104:
		  E.pos=sstack[ssp].pos;
		  sp1--;
		  break;
	}

	n1.syl=tempsy;
	n1.pos=E.pos;
	lrparse1(num);
      }

      if((lr1==ACC)&&(stack1[sp1]==1))
      {
	 gen("=",sstack[ssp],oth,ibuf[0].pos);
	 ssp=ssp-3;
	 sp1=sp1-3;
      }
}

/*************************/
lrparse2(int num)
{
   int templabel;
   lr1=action2[stack1[sp1]][change2(n1.syl)];
   if(g++==4) getch();
   printf("\tstack2[%d]=%d\t\t n2=%d\t\tlr2=%d\n",sp1,stack[sp1].pos,n1.syl,lr1);
   if(lr1==-1)
   {
      if(sign==2) printf("\n  while Error!\n ");
      if(sign==3) printf("\n if Error!\n");
      getch();
      /*exit(0);*/
   }
   if((lr1<16)&&(lr1>=0))
   {
      sp1++;
      stack1[sp1]=lr1;
      ssp++;
      sstack[ssp].syl=n1.syl;
      sstack[ssp].pos=n1.pos;
      if((n1.syl!=tempsy)&&(n1.syl!=EA)&&(n1.syl!=EO)) num++;
      n1.syl=ibuf[num].syl;
      n1.pos=ibuf[num].pos;
      lrparse2(num);
   }
   if((lr1>=100)&&(lr1<109))
   {
      switch(lr1)
      {
	 case 100: break;
	 case 101:
		   ntab2[label].tc=nxq;
		   ntab2[label].fc=nxq+1;
		   gen("jnz",sstack[ssp],oth,0);
		   gen("j",oth,oth,0);
		   sp1--;
		   ssp--;
		   label++;
		   n1.syl=tempsy;
		   break;
	 case 102:
		   ntab2[label].tc=nxq;
		   ntab2[label].fc=nxq+1;
		   switch(sstack[ssp-1].pos)
		   {
		     case 0:
			     gen("j<=",sstack[ssp-2],sstack[ssp],0);
			     break;
		     case 1:
			     gen("j<",sstack[ssp-2],sstack[ssp],0);
			     break;
		     case 2:
			     gen("j>=",sstack[ssp-2],sstack[ssp],0);
			     break;
		     case 3:
			     gen("j>",sstack[ssp-2],sstack[ssp],0);
			     break;
		     case 4:
			     gen("j<>",sstack[ssp-2],sstack[ssp],0);
			     break;
		     case 5:
			     gen("j=",sstack[ssp-2],sstack[ssp],0);
			     break;
		   }
		   gen("j",oth,oth,0);
		   ssp=ssp-3;
		   sp1=sp1-3;
		   label++;
		   n1.syl=tempsy;
		   break;
	 case 103:
		   label=label-1;
		   ssp=ssp-3;
		   sp1=sp1-3;
		   label++;
		   n1.syl=tempsy;
		   break;
	 case 104:
		   label=label-1;
		   templabel=ntab2[label].tc;
		   ntab2[label].tc=ntab2[label].fc;
		   ntab2[label].fc=templabel;
		   ssp=ssp-2;
		   sp1=sp1-2;
		   label++;
		   n1.syl=tempsy;
		   break;
	 case 105:
		   backpatch(ntab2[label-1].tc,nxq);
		   label=label-1;
		   ssp=ssp-2;
		   sp1=sp1-2;
		   label++;
		   n1.syl=EA;
		   break;
	 case 106:
		   label=label-2;
		   ntab2[label].fc=ntab2[label+1].tc;
		   ntab2[label].fc=merg(ntab2[label].fc,ntab2[label+1].fc);
		   ssp=ssp-2;
		   sp1=sp1-2;
		   label++;
		   n1.syl=tempsy;
		   break;
	 case 107:
		   backpatch(ntab2[label-1].fc,nxq);
		   label=label-1;
		   ssp=ssp-2;
		   sp1=sp1-2;
		   label++;
		   n1.syl=EO;
		   break;
	 case 108:
		   label=label-2;
		   ntab2[label].fc=ntab2[label+1].fc;
		   ntab2[label].tc=merg(ntab2[label].tc,ntab2[label+1].tc);
		   ssp=ssp-2;
		   sp1=sp1-2;
		   label++;
		   n1.syl=tempsy;
		   break;
      }

      lrparse2(num);
   }
   if(lr1==ACC) return 1;
}


/********************************/
test(int value)
{
   switch(value)
   {
      case intconst:
      case ident:
      case plus:
      case times:
      case becomes:
      case lparent:
      case rparent:
      case rop:
      case op_and:
      case op_or:
      case op_not:
		   return 1;
      default:      return 0;
   }
}

/**********************************/
lrparse()
{
   int i1=0;
   int num=0;

   if(test(n.syl))
   {
      if(stack[sp].syl==syl_while) sign=2;
      else
      {
	 if(stack[sp].syl==syl_if) sign=3;
	 else sign=1;
      }

      do
      {
	 ibuf[i1].syl=n.syl;
	 ibuf[i1].pos=n.pos;
	 if(ibuf[i1].syl==rparent)
	 {
	   readnu();
	   i1++;
	   break;
	 }
	 readnu();
	 i1++;
      }while(test(n.syl));

      ibuf[i1].syl=jinghao;
      pbuf--;
      sstack[0].syl=jinghao;
      ssp=0;
      if(sign==1)
      {
	sp1=0;
	stack1[sp1]=0;
	num=2;
	n1.syl=ibuf[num].syl;
	n1.pos=ibuf[num].pos;
	printf("\nThe follwing stack is for suan shu biao da shi\n");
	g=0;
	lrparse1(num);
	printf("then ,gui yue wei 'a' \n\n");
	n.syl=a;
      }

      if((sign==2) || (sign==3))
      {
	pointmark++;
	labelmark[pointmark].nxq1=nxq;
	sp1=0;
	stack1[sp1]=0;
	num=0;
	n1.syl=ibuf[num].syl;
	n1.pos=ibuf[num].pos;
        printf("\nThe follwing stack is for boolean biao da shi\n");
	g=0;
	lrparse2(num); printf("then ,gui yue wei 'e' \n\n");
	labelmark[pointmark].tc1=ntab2[label-1].tc;
	labelmark[pointmark].fc1=ntab2[label-1].fc;
	backpatch(labelmark[pointmark].tc1,nxq);
	n.syl=e;
      }
   }
   lr=action[stack[sp].pos][n.syl];
   printf("stack[%d]=%d\t\t n=%d\t\tlr=%d\n",sp,stack[sp].pos,n.syl,lr);

   if((lr<20)&&(lr>=0))
   {
      sp++;
      stack[sp].pos=lr;
      stack[sp].syl=n.syl;
      readnu();
      lrparse();
   }
   if((lr<=106)&&(lr>=100))
   {
      switch(lr)
      {
	case 100: break;
	case 101:
		  printf("s->if e s else s guiyue\n");
		  sp=sp-5;
		  n.syl=s;
		  fexp[labeltemp[pointtemp]].result=nxq;
		  pointtemp--;
		  if(stack[sp-1].syl==syl_if)
		  {
		     gen("j",oth,oth,0);
		     backpatch(labelmark[pointmark].fc1,nxq);
		     pointtemp++;
		     labeltemp[pointtemp]=nxq-1;
		  }
		  pointmark--;
		  if(stack[sp-1].syl==syl_while)
		  {
		     gen("j",oth,oth,labelmark[pointmark].nxq1);
		     backpatch(labelmark[pointmark].fc1,nxq);
		  }
		  break;

	case 102:
		  printf("s->while e s guiyue \n");
		  sp=sp-3;
		  n.syl=s;
		  pointmark--;
		  if(stack[sp-1].syl==syl_while)
		  {
		     gen("j",oth,oth,labelmark[pointmark].nxq1);
		     backpatch(labelmark[pointmark].fc1,nxq);
		  }

		  if(stack[sp-1].syl==syl_if)
		  {
		     gen("j",oth,oth,0);
		     fexp[labelmark[pointmark].fc1].result=nxq;
		     pointtemp++;
		     labeltemp[pointtemp]=nxq-1;
		  }
		  break;
	case 103:
		  printf("s->{ L } guiyue \n");
		  sp=sp-3;
		  n.syl=s;

		  if(stack[sp-1].syl==syl_if)
		  {
		     gen("j",oth,oth,0);
		     backpatch(labelmark[pointmark].fc1,nxq);
		     pointtemp++;
		     labeltemp[pointtemp]=nxq-1;
		  }

		  if(stack[sp-1].syl==syl_while)
		  {
		     gen("j",oth,oth,labelmark[pointmark].nxq1);
		     backpatch(labelmark[pointmark].fc1,nxq);
		  }
		  getch();
		  break;
	case 104:
		  printf("s->a; guiyue \n");
		  sp=sp-2;
		  n.syl=s;
		  if(stack[sp-1].syl==syl_if)
		  {
		     gen("j",oth,oth,0);
		     backpatch(labelmark[pointmark].fc1,nxq);
		     pointtemp++;
		     labeltemp[pointtemp]=nxq-1;
		  }
		  if(stack[sp-1].syl==syl_while)
		  {
		      gen("j",oth,oth,labelmark[pointmark].nxq1);
		      backpatch(labelmark[pointmark].fc1,nxq);
		  }
		  break;
	case 105:
		  printf("L->s guiyue\n");
		  sp=sp-1;
		  n.syl=L;
		  break;
	case 106:
		  printf("L->SL guiyue\n");
		  sp=sp-2;
		  n.syl=L;
		  break;
	}
	getch();
	pbuf--;
	lrparse();
	}
	if(lr==ACC) return ACC;
}

/*********************************/
disp1()
{
   int temp1=0;
   printf("\n.........chi fa fen xi ........\n");
   for(temp1=0;temp1<count;temp1++)
   {
      printf("%d\t%d\n",buf[temp1].syl,buf[temp1].pos);
      if(temp1==20)
      {
	 printf("Press any key to continue...\n");
	 getch();
      }
   }
   getch();
}

/*******************************/
disp2()
{
   int temp1=100;
   printf("\n-------si yuan shi-------\n");
   for(temp1=100;temp1<nxq;temp1++)
   {
      printf("%d\t",temp1);
      printf("(%s,\t",fexp[temp1].op);
      if(fexp[temp1].arg1.syl==ident)
	printf("%s,\t",ntab1[fexp[temp1].arg1.pos]);
      else
      {
	 if(fexp[temp1].arg1.syl==tempsy)
	   printf("T%d,\t",fexp[temp1].arg1.pos);
	 else
	 {
	   if(fexp[temp1].arg1.syl==intconst)
	     printf("%d,\t",fexp[temp1].arg1.pos);
	   else printf("\t");
	 }
      }
      if(fexp[temp1].arg2.syl==ident)
	printf("%s,\t",ntab1[fexp[temp1].arg2.pos]);
      else
      {
	 if(fexp[temp1].arg2.syl==tempsy)
	   printf("T%d,\t",fexp[temp1].arg2.pos);
	 else
	 {
	   if(fexp[temp1].arg2.syl==intconst)
	     printf("%d,\t",fexp[temp1].arg2.pos);
	   else printf(",\t");
	 }
      }
      if(fexp[temp1].op[0] != 'j')
      {
	 if(fexp[temp1].result>=100)
	   printf("T%d\t)",fexp[temp1].result-100);
	 else
	   printf("%s\t)",ntab1[fexp[temp1].result]);
      }
      else printf("%d\t)",fexp[temp1].result);

      if(temp1==20)
      {
	printf("\n Press any key to continue.....\n");
	getch();
      }
      printf("\n");
   }
   getch();
}

/***********************************/
disp3()
{
   int tttt;
   printf("\n\n row %d, creat %d chan sheng shi\n",lnum,count);
   getch();
   printf("\n.....bian liang ming biao.........\n");
   for(tttt=0;tttt<tt1;tttt++)
      printf("%d\t%s\n",tttt,ntab1[tttt]);
      getch();
}


/*********************************/
main()
{
   cfile=fopen("source.dat","r");
   clrscr();
   readch();
   scan();
   disp1();
   disp3();
   stack[sp].pos=0;
   stack[sp].syl=-1;
   stack1[sp1]=0;
   oth.syl=-1;
   printf("\n..........zhuang tai zhan..........\n");
   readnu();
   lrparse();
    getch();
   disp2();
   printf("\ncheng xu jie shu\n");
   getch();
   getch();
}





.

⌨️ 快捷键说明

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