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

📄 语法分析ll1b.txt

📁 这是编译原理的源代码
💻 TXT
📖 第 1 页 / 共 3 页
字号:
   {   TreeNode *t=PopOp();
	   TreeNode *Rnum=PopNum();
	   TreeNode *Lnum=PopNum();
       t->child[1]=Rnum;
	   t->child[0]=Lnum;
       PushNum(t);

       sTop=ReadOpStack();
   }  
   PushOp(currentP);
}

void CparseLL1::process89()
{
   Push(2,RPAREN);
   Push(1,Exp);
   Push(2,LPAREN);

   TreeNode *t=newExpNode(OpK);
   t->attr.ExpAttr.op = currentToken.Lex; /*把左括号也压入栈中*/
   PushOp(t);
   expflag++;
}

void CparseLL1::process90()
{
  Push(2,INTC);
	
  TreeNode *t=newExpNode(ConstK);
  t->attr.ExpAttr.val = atoi(currentToken.Sem);
  /*常数节点入操作数栈*/
  PushNum(t);

}

void CparseLL1::process91()
{
 Push(1,Variable);
}

void CparseLL1::process92()
{
	Push(1,VariMore);
	Push(2,ID);
	
	currentP=newExpNode(VariK);
	strcpy( currentP->name[0] , currentToken.Sem );
	currentP->idnum++;
	/*变量节点入操作数栈*/
	PushNum(currentP);

}

void CparseLL1::process93()
{
 /*标识符变量*/
 currentP->attr.ExpAttr.varkind=IdV;
}

void CparseLL1::process94()
{  
	Push(2, RMIDPAREN);
	Push(1, Exp);
	Push(2, LMIDPAREN);
    /*数组成员变量*/
    currentP->attr.ExpAttr.varkind=ArrayMembV;
	PushPA(&currentP->child[0]);

	/*要进入表达式处理,初始化操作符栈*/
	//操作符栈的栈底存入一个特殊的操作符作为标志
    TreeNode *t=newExpNode(OpK);
    t->attr.ExpAttr.op = END ;
    PushOp(t);  	

   	/*要进入数组下标表达式处理,在函数CparseLL1::process84处理中,要
	  操作语法树栈,故将标志getExpResult2设置为真值*/
    getExpResult2 = TRUE;


}

void CparseLL1::process95()
{
	Push(1, FieldVar);
	Push(2, DOT);
    /*域成员变量*/
	currentP->attr.ExpAttr.varkind=FieldMembV;
	PushPA(&currentP->child[0]);
}

void CparseLL1::process96()
{
	Push(1,FieldVarMore);
	Push(2,ID);
    
	/*纪录域的成员*/
	currentP=newExpNode(VariK);
	strcpy( currentP->name[0] , currentToken.Sem );
	currentP->idnum++;

	TreeNode **t=PopPA( );
	(*t)=currentP;


}

void CparseLL1::process97()
{
  /*域成员是标识符变量*/
  currentP->attr.ExpAttr.varkind=IdV;
}

void CparseLL1::process98()
{
	Push(2,RMIDPAREN);
	Push(1,Exp);
	Push(2,LMIDPAREN);
	/*域成员是数组变量*/
	currentP->attr.ExpAttr.varkind=ArrayMembV;
	/*指向数组成员表达式*/
	PushPA(&currentP->child[0]);

    //操作符栈的栈底存入一个特殊的操作符作为标志
    TreeNode *t=newExpNode(OpK);
    t->attr.ExpAttr.op = END ;
    PushOp(t);  	

	/*要进入数组下标表达式处理,在函数CparseLL1::process84处理中,要
	  操作语法树栈,故将标志getExpResult2设置为真值*/
    getExpResult2 = TRUE;
}
void CparseLL1::process99()
{ 
    Push(2,LT);
}

void CparseLL1::process100()
{  
	Push(2,EQ);
}

void CparseLL1::process101()
{  
	Push(2,PLUS);
}

void CparseLL1::process102()
{ 
	Push(2,MINUS);
}

void CparseLL1::process103()
{
	Push(2,TIMES);
}

void CparseLL1::process104()
{
    Push(2,OVER);
}


/****************************************************/
/* 函数名  predict									*/
/* 功  能  选择产生式函数							*/
/* 说  明  										    */
/****************************************************/
void CparseLL1::predict(int num)
{  switch( num )
    { case 1:     CparseLL1::process1();	break;	  
      case 2:     CparseLL1::process2();	break;
      case 3:     CparseLL1::process3();	break;
      case 4:     CparseLL1::process4();	break;
	  case 5:	  CparseLL1::process5();	break;
      case 6:	  CparseLL1::process6();	break;
      case 7:	  CparseLL1::process7();	break;
      case 8:	  CparseLL1::process8();	break;
	  case 9:	  CparseLL1::process9();	break;
      case 10:	  CparseLL1::process10();	break;
      case 11:	  CparseLL1::process11();	break;
      case 12:	  CparseLL1::process12();	break;
      case 13:	  CparseLL1::process13();	break;
      case 14:	  CparseLL1::process14();	break;
      case 15:	  CparseLL1::process15();	break;
      case 16:	  CparseLL1::process16();	break;
      case 17:	  CparseLL1::process17();	break;
      case 18:	  CparseLL1::process18();	break;
      case 19:	  CparseLL1::process19();	break;
      case 20:	  CparseLL1::process20();	break;
      case 21:	  CparseLL1::process21();	break;
	  case 22:	  CparseLL1::process22();	break;
      case 23:	  CparseLL1::process23();	break;
      case 24:	  CparseLL1::process24();	break;
	  case 25:	  CparseLL1::process25();	break;
      case 26:	  CparseLL1::process26();	break;
      case 27:	  CparseLL1::process27();	break;
      case 28:	  CparseLL1::process28();	break;
      case 29:	  CparseLL1::process29();	break;
      case 30:	  CparseLL1::process30();	break;
	  case 31:	  CparseLL1::process31();	break;
      case 32:	  CparseLL1::process32();	break;
      case 33:	  CparseLL1::process33();	break;
	  case 34:	  CparseLL1::process34();	break;
      case 35:	  CparseLL1::process35();	break;
     
	  case 36:	  CparseLL1::process36();	break;
      case 37:	  CparseLL1::process37();	break;
      case 38:	  CparseLL1::process38();	break;
      case 39:	  CparseLL1::process39();	break;
      case 40:	  CparseLL1::process40();	break;
	  
      case 41:	  CparseLL1::process41();	break;
      case 42:	  CparseLL1::process42();	break;
	  case 43:	  CparseLL1::process43();	break;
      case 44:	  CparseLL1::process44();	break;
      case 45:	  CparseLL1::process45();	break;
	  
	  case 46:    CparseLL1::process46();	break;
      case 47:	  CparseLL1::process47();	break;
      case 48:	  CparseLL1::process48();	break;
      case 49:	  CparseLL1::process49();	break;
      case 50:	  CparseLL1::process50();	break;
  
	  case 51:	  CparseLL1::process51();	break;
      case 52:	  CparseLL1::process52();	break;
      case 53:	  CparseLL1::process53();	break;
      case 54:	  CparseLL1::process54();	break;
      case 55:	  CparseLL1::process55();	break;
      case 56:	  CparseLL1::process56();	break;

	  case 57:	  CparseLL1::process57();   break;
      case 58:	  CparseLL1::process58();	break;
      case 59:	  CparseLL1::process59();	break;
      case 60:	  CparseLL1::process60();	break;
      case 61:	  CparseLL1::process61();	break;
      case 62:	  CparseLL1::process62();	break;
      case 63:	  CparseLL1::process63();	break;
      case 64:	  CparseLL1::process64();	break;
      case 65:	  CparseLL1::process65();	break;
      case 66:	  CparseLL1::process66();	break;
      case 67:	  CparseLL1::process67();	break;
      case 68:	  CparseLL1::process68();	break;
	  case 69:    CparseLL1::process69();	break;
	  case 70:    CparseLL1::process70();	break;
               
      case 71:	  CparseLL1::process71();	break;
      case 72:	  CparseLL1::process72();	break;
      case 73:	  CparseLL1::process73();	break;
      case 74:	  CparseLL1::process74();	break;
      case 75:	  CparseLL1::process75();	break;
	 
	  case 76:	  CparseLL1::process76();	break;
      case 77:	  CparseLL1::process77();	break;
	  case 78:    CparseLL1::process78();	break;
      case 79:    CparseLL1::process79();	break;
	  case 80:	  CparseLL1::process80();	break;
      case 81:	  CparseLL1::process81();	break;
      case 82:	  CparseLL1::process82();	break;
      case 83:	  CparseLL1::process83();	break;
      case 84:	  CparseLL1::process84();	break;
      case 85:	  CparseLL1::process85();	break;
	  case 86:	  CparseLL1::process86();	break;
      case 87:	  CparseLL1::process87();	break;
      case 88:	  CparseLL1::process88();	break;
	  case 89:	  CparseLL1::process89();	break;
      case 90:	  CparseLL1::process90();	break;
      case 91:	  CparseLL1::process91();	break;
      case 92:	  CparseLL1::process92();	break;
      case 93:	  CparseLL1::process93();	break;
      case 94:	  CparseLL1::process94();	break;
      case 95:	  CparseLL1::process95();	break;
      case 96:	  CparseLL1::process96();	break;
      case 97:    CparseLL1::process97();	break;
	  case 98:    CparseLL1::process98();	break;
	  case 99:    CparseLL1::process99();	break;
	  case 100:   CparseLL1::process100();	break;
	  case 101:   CparseLL1::process101();	break;
	  case 102:   CparseLL1::process102();	break;
	  case 103:   CparseLL1::process103();	break;
	  case 104:   CparseLL1::process104();	break;
	  case 0:
	  default:	  { 
		             syntaxError("unexpected token ->");  
					 fprintf(listing,"  %s",currentToken.Sem);
				  }
   }		  
}   

/****************************************************/
/* 函数名  parseLL1									*/
/* 功  能  LL1语法分析主函数						*/
/* 说  明  										    */
/****************************************************/

Cglobal::TreeNode  * CparseLL1::parseLL1()
{
 
 /*************从构造函数拷贝,每次调用都要初始化*******************/

//用于读token文件:
 fpnum=0;	//用于gettoken函数

/*纪录当前语法树节点*/
currentP=NULL;

/*为保存类型需要的临时变量*/
temp=NULL;
/*保存当前指针,以便修改后,将其恢复*/
saveP =	NULL;

/*纪录表达式中,未匹配的左括号数目*/
expflag = 0;

/*判断简单表达式处理结束,整个表达式是否处理结束标识*/
/*当是条件表达式时,取假值,简单表达式时,取真值*/
/*用于函数preocess84*/
getExpResult = TRUE; 

/*仅用于数组变量,故初始化为假,遇到数组变量时,将其
  改变为真,以便在函数CparseLL1::process84中,即算术表达式结束时,
  从语法树栈中弹出相应指针,将数组下标表达式的结构链入
  节点中*/
 getExpResult2 = FALSE;

 /*符号栈顶指针*/
 StackTop=NULL;
/*栈空标志*/
 STACKEMPTY=TRUE; 

/*语法树栈顶指针*/
 StackTopPA=NULL;
/*栈空标志*/
 paSTACKEMPTY=TRUE;

/*操作符栈的栈顶指针*/
 OpStackTop=NULL;
/*操作符栈空标志*/
 OpSTACKEMPTY = TRUE;  

/*操作数栈的栈顶指针*/
 NumStackTop=NULL;
/*操作数栈空标志*/	
 NumSTACKEMPTY = TRUE;

/********************************************************/






  NontmlType  stacktopN;

  TmlType     stacktopT;    

  /*语法树的根节点*/
  TreeNode *rootPointer=NULL;
 
  int pnum=0; //纪录选中的产生式编号

  //初始化行号为0
  lineno = 0;

  //初始化:错误标志为假
  Error = FALSE;

  CreatLL1Table();
 
  STACKEMPTY = TRUE;
  
  /*指向整个语法树根节点的指针,由它得到语法树*/
  rootPointer = newRootNode();
  

  /*从这里开始进行语法分析和语法树的生成*/
  PushPA ( &(rootPointer->child[2])); 
  PushPA ( &(rootPointer->child[1])); 
  PushPA ( &(rootPointer->child[0])); 


  Push(1,Program);

  /*取一个token */
  gettoken(&currentToken);

  lineno=currentToken.lineshow;

//当有语法错误时,不再继续进行下面的检查:
  while  (!(STACKEMPTY)&&!(Error)) 
  {
	  if ( readStackflag() == 2) /*检测终极符是否匹配*/
		 {   
			 stacktopT=readstackT();
            
			 if (stacktopT==currentToken.Lex)
			 {
				    //跟踪LL(1)语法分析:
					//AfxGetApp()->m_pMainWnd->MessageBox("match!");
					//AfxGetApp()->m_pMainWnd->MessageBox(currentToken.Sem);
				
				Pop(); 
				gettoken(&currentToken);
				lineno=currentToken.lineshow;
				
		
			 }
             else
			 {    syntaxError("unexpected  token ->  ");
                  fprintf(listing,"  %s",currentToken.Sem); 
                  fprintf(listing,"		");
				  
				  //AfxGetApp()->m_pMainWnd->MessageBox("not match!");
				  
			 } 
		 }    
		else {  /*根据非终极符和栈中符号进行预测*/
			    stacktopN=readstackN();
		        
				pnum= LL1Table[stacktopN][currentToken.Lex];
				char * str='\0';
				//跟踪LL1语法分析:
			    //AfxGetApp()->m_pMainWnd->MessageBox("选择产生式!");
				
				Pop(); 
				predict(pnum);  
				
		     }
  }

if  ((!Error)&&(currentToken.Lex != ENDFILE1))
  syntaxError("Code  ends  before  file \n");

return  rootPointer;

}



⌨️ 快捷键说明

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