亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? parse.cpp

?? 編譯原理學(xué)習(xí)使用的代碼 內(nèi)容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/****************************************************/
/* 文件 parse.cpp									*/
/* 說明 TINY編譯器的語法分析器實現(xiàn)					*/
/* 主題 編譯器結(jié)構(gòu):原理和實例						*/
/****************************************************/

/***********  該文件所包含的頭文件  ****************/

#include "globals.h"	

#include "util.h"		

#include "scanner.h"	

#include "parse.h"		

#include "string.h"

static TokenType token;

char * temp_name;

static int line0;

/********** 遞歸調(diào)用的函數(shù)原型 ************/

static TreeNode * program(void);  

static TreeNode * programHead(void);

static TreeNode * declarePart(void);

static TreeNode * typeDec(void);

static TreeNode * typeDeclaration(void);

static TreeNode * typeDecList(void);

static TreeNode * typeDecMore(void);

static void  typeId(TreeNode * t);

static void  typeName(TreeNode * t);

static void  baseType(TreeNode * t);

static void  structureType(TreeNode * t);

static void  arrayType(TreeNode * t);

static void  recType(TreeNode * t);

static TreeNode * fieldDecList(void);
 
static TreeNode * fieldDecMore(void);

static void  idList(TreeNode * t);

static void  idMore(TreeNode * t);

static TreeNode * varDec(void);

static TreeNode * varDeclaration(void);

static TreeNode * varDecList(void);

static TreeNode * varDecMore(void);

static void  varIdList(TreeNode * t);

static void  varIdMore(TreeNode * t);

static TreeNode * procDec(void);

static TreeNode * procDeclaration(void);

static void  paramList(TreeNode * t);

static TreeNode * paramDecList(void);

static TreeNode * param(void);

static TreeNode * paramMore(void);

static void  formList(TreeNode * t);

static void  fidMore(TreeNode * t);

static TreeNode * procDecPart(void);

static TreeNode * procBody(void);

static TreeNode * programBody(void);

static TreeNode * stmList(void);

static TreeNode * stmMore(void);

static TreeNode * stm(void);

static TreeNode * assCall(void);

static TreeNode * assignmentRest(void);	

static TreeNode * conditionalStm(void);

static TreeNode * loopStm(void);

static TreeNode * inputStm(void);		

static TreeNode * outputStm(void);	

static TreeNode * returnStm(void);

static TreeNode * callStmRest(void);

static TreeNode * actParamList(void);

static TreeNode * actParamMore(void);

static TreeNode * exp(void);			/* 處理表達式函數(shù) */

static TreeNode * simple_exp(void);		/* 處理簡單表達式函數(shù) */

static TreeNode * term(void);			/* 處理項函數(shù) */

static TreeNode * factor(void);			/* 處理因子函數(shù) */

static TreeNode * variable(void);

static void variMore(TreeNode * t);

static TreeNode * fieldvar(void);

static void fieldvarMore(TreeNode * t );

         

/************ 語法分析功能函數(shù) **************/

/********************************************************************/
/* 函數(shù)名 syntaxError												*/
/* 功  能 語法錯誤處理函數(shù)											*/
/* 說  明 將函數(shù)參數(shù)message指定的錯誤信息格式化寫入列表文件listing	*/
/*		  設(shè)置錯誤追蹤標(biāo)志Error為TRUE								*/
/********************************************************************/
static void syntaxError(char * message)

{ 
	fprintf(listing,"\n>>> error :   ");
    fprintf(listing,"Syntax error at line %d: %s\n",token.lineshow,message);
	Error = TRUE;
}

/********************************************************************/
/* 函數(shù)名 match														*/
/* 功  能 終極符匹配處理函數(shù)										*/
/* 說  明 函數(shù)參數(shù)expected給定期望單詞符號與當(dāng)前單詞符號token相匹配	*/
/*        如果不匹配,則報非期望單詞語法錯誤							*/
/********************************************************************/
static void match(LexType expected)

{ 
  if (token.Lex == expected)   
  {
	  ReadNextToken(&token);
	  line0 = token.lineshow;
  }
  else 
  {
	  syntaxError("not match error ");
	  fprintf(listing,"'%s'\n",token.Sem);
	  ReadNextToken(&token);
	  exit(0);
  }
  
}

/********************************************************************/
/* 函數(shù)名 program												    */
/* 功  能 總程序的處理函數(shù)								        	*/
/* 產(chǎn)生式 < program > ::= programHead declarePart programBody .     */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/*        語法樹的根節(jié)點的第一個子節(jié)點指向程序頭部分programHead,    */
/*        DeclaraPart為programHead的兄弟節(jié)點,程序體部分programBody  */
/*        為declarePart的兄弟節(jié)點.                                  */
/********************************************************************/
TreeNode * program(void)
{
	TreeNode * t=programHead();
	TreeNode * q=declarePart();
	TreeNode * s=programBody();
	
	TreeNode * root = newRootNode();
    if(root!=NULL)
	{
		root->lineno = 0;
		if(t!=NULL) root->child[0] = t;
	      else syntaxError("a program head is expected!");
	    if(q!=NULL) root->child[1] = q;
	    if(s!=NULL) root->child[2] = s;
	      else syntaxError("a program body is expected!");
	}
	match(DOT);

	return root;
}

/********************************************************************/
/* 函數(shù)名 programHead											    */
/* 功  能 程序頭的處理函數(shù)								        	*/
/* 產(chǎn)生式 < programHead > ::= PROGRAM  ProgramName                  */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
TreeNode * programHead(void)
{
    TreeNode * t = newPheadNode();
	match(PROGRAM);
    if((t!=NULL)&&(token.Lex==ID))
	{   
		t->lineno = 0;
		strcpy(t->name[0], token.Sem);
	}
    match(ID);
    return t;
}	
    
/*************************聲明部分***********************************/

/********************************************************************/
/* 函數(shù)名 declarePart											    */
/* 功  能 聲明部分的處理函數(shù)								     	*/
/* 產(chǎn)生式 < declarePart > ::= typeDec  varDec  procDec              */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
TreeNode * declarePart(void)
{
     /*類型*/
	 TreeNode * typeP = newDecANode(TypeK);  
	 TreeNode * pp = typeP;  
	 
	 if(typeP!=NULL)
	 {
		 typeP->lineno = 0;
		 TreeNode * tp1 = typeDec();
	     if(tp1!=NULL)
		     typeP->child[0] = tp1;
		 else
		 {
			 free(typeP);
		     typeP=NULL;
		 }
	 }
	 /*變量*/
	 TreeNode * varP = newDecANode(VarK);
	 
	 if(varP != NULL)
	 {
		 varP->lineno = 0;
		 TreeNode * tp2 = varDec();
		 if(tp2 != NULL)
	          varP->child[0] = tp2;
		 else 
		 {
			 free(varP);
		     varP=NULL;
		 }
     }
	 /*函數(shù)*/
	 TreeNode * s = procDec();
     
	 if(s==NULL){}
	 
	 if(varP==NULL){varP=s;}
	 
     if(typeP==NULL){pp=typeP=varP;}
	 
	 if(typeP!=varP)
	 {
		typeP->sibling = varP;
        typeP = varP;
	 }
	 if(varP!=s)
	 {
		varP->sibling = s;
		varP = s;
	 }
	 return pp;
}



/**************************類型聲明部分******************************/

/********************************************************************/
/* 函數(shù)名 typeDec									     		    */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < typeDec > ::= ε | TypeDeclaration                      */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
TreeNode * typeDec(void)
{
	TreeNode * t = NULL;
	switch (token.Lex)
	{ 
	  case TYPE: t = typeDeclaration(); break;
	  case VAR:
	  case PROCEDURE:
      case BEGIN: break;
      default :
		  ReadNextToken(&token);
		  syntaxError("unexpected token is here!");
		  break;
	}
	return t;
}
		  
	 
/********************************************************************/
/* 函數(shù)名 TypeDeclaration									  	    */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < TypeDeclaration > ::= TYPE  TypeDecList                 */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
TreeNode * typeDeclaration(void)
{
	match(TYPE);
	TreeNode * t = typeDecList();
	if (t==NULL)
	{
        syntaxError("a type declaration is expected!");
	}
	return t;
}


/********************************************************************/
/* 函數(shù)名 TypeDecList		 							  	        */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < TypeDecList > ::= typeId = typeName ; typeDecMore       */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
TreeNode * typeDecList(void)
{
	TreeNode * t = newDecNode();
	if (t != NULL)
	{
		t->lineno = line0;
		typeId(t);                               
	    match(EQ);  
	    typeName(t); 
	    match(SEMI);                           
        TreeNode * p = typeDecMore();
		if (p!=NULL)
			t->sibling = p;
	}
    return t;
}


/********************************************************************/
/* 函數(shù)名 typeDecMore		 							            */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < typeDecMore > ::=    ε | TypeDecList                   */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
TreeNode *  typeDecMore(void)
{
	TreeNode * t=NULL;
    switch(token.Lex)
	{
	case VAR:         
	case PROCEDURE:
	case BEGIN:
		break;
	case ID:
		t = typeDecList();
		break;
	default:
		  ReadNextToken(&token);
		  syntaxError("unexpected token is here!");
		  break;
	}
	return t;
}


/********************************************************************/
/* 函數(shù)名 typeId		 							  	            */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < typeId > ::= id                                         */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
void typeId(TreeNode * t)
{
	int tnum = (t->idnum);
	if ((token.Lex==ID)&&(t!=NULL))
	{
	    strcpy(t->name[tnum] ,token.Sem);
		tnum = tnum+1;
	}
	t->idnum = tnum;
	match(ID);
}


/********************************************************************/
/* 函數(shù)名 typeName		 							  	            */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < typeName > ::= baseType | structureType | id            */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */
/********************************************************************/
void typeName(TreeNode * t)
{
      if (t!=NULL)
	      switch (token.Lex)
		  {
		  case INTEGER:
		  case CHAR:    baseType(t);break;
		  case ARRAY:
		  case RECORD:  structureType(t);break;
		  case ID:      
			      t->kind.dec = IdK;
				  strcpy(t->attr.type_name ,token.Sem);
			      match(ID);
			      break;
		  default:
			  ReadNextToken(&token);
			  syntaxError("unexpected token is here!");
		      break;
		  } 
}


/********************************************************************/
/* 函數(shù)名 baseType		 							  	            */
/* 功  能 類型聲明部分的處理函數(shù)						        	*/
/* 產(chǎn)生式 < baseType > ::=  INTEGER | CHAR                          */
/* 說  明 函數(shù)根據(jù)文法產(chǎn)生式,調(diào)用相應(yīng)的遞歸處理函數(shù),生成語法樹節(jié)點  */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产传媒一区在线| 欧美国产精品一区| 久久婷婷一区二区三区| 欧美性大战久久| 欧美成人video| 精品国产三级a在线观看| 亚洲精品一区二区三区99| 日本一区二区三级电影在线观看 | 欧美无乱码久久久免费午夜一区| 99久久精品一区| 欧美日韩另类国产亚洲欧美一级| 日韩欧美亚洲国产精品字幕久久久| 国产欧美一二三区| 亚洲人成伊人成综合网小说| 国产精品美女一区二区| 日韩精品电影一区亚洲| 国产制服丝袜一区| 色偷偷成人一区二区三区91 | 亚洲三级在线播放| 亚洲国产精品影院| 国产一本一道久久香蕉| 在线一区二区观看| 久久久亚洲国产美女国产盗摄| 中文字幕日韩一区二区| 美女网站在线免费欧美精品| 成人午夜激情片| 欧美丰满美乳xxx高潮www| 中文字幕国产精品一区二区| 亚洲福利视频一区| 精品综合免费视频观看| 欧美日韩国产精品自在自线| 国产亚洲短视频| 国产精品久久久久aaaa樱花 | 91精品国产一区二区三区| 国产日韩欧美麻豆| 一片黄亚洲嫩模| 成人免费毛片app| 4438成人网| |精品福利一区二区三区| 久久er99精品| 成人高清在线视频| 中文字幕制服丝袜成人av| 欧美草草影院在线视频| 亚洲成人黄色影院| 91成人在线免费观看| 亚洲国产精品激情在线观看| 香港成人在线视频| 99久免费精品视频在线观看| 欧美电影免费观看完整版| 亚洲精品你懂的| 韩国v欧美v日本v亚洲v| 7777精品伊人久久久大香线蕉 | 久久影院电视剧免费观看| 亚洲麻豆国产自偷在线| 国产99一区视频免费| 日韩一区二区麻豆国产| 亚洲欧洲综合另类在线| 成人丝袜高跟foot| 久久伊99综合婷婷久久伊| 一区二区高清免费观看影视大全| 丁香五精品蜜臀久久久久99网站| 欧美一级免费大片| 日韩国产在线观看| 欧美视频你懂的| 一区二区三区在线观看欧美| 色综合网站在线| 国产精品久久久久久久岛一牛影视| 精品亚洲国内自在自线福利| 欧美成人女星排名| 免费人成精品欧美精品| 在线影院国内精品| 午夜欧美视频在线观看| 色婷婷香蕉在线一区二区| 91精品国产综合久久福利软件| 亚洲444eee在线观看| 色欧美日韩亚洲| 久久久久国产成人精品亚洲午夜| 国产精品影视在线观看| 精品日产卡一卡二卡麻豆| 国产精品一区二区你懂的| 久久综合九色综合97婷婷| 国产suv精品一区二区6| 国产欧美一区二区精品性| 国产在线视频不卡二| 国产午夜精品在线观看| 国产黄色91视频| 国产日韩亚洲欧美综合| 99国产精品国产精品久久| 国产精品二三区| 国产91在线观看丝袜| 国产精品国产三级国产普通话蜜臀| 成人自拍视频在线观看| 成人欧美一区二区三区在线播放| 波多野结衣在线一区| 国产精品蜜臀在线观看| 91成人看片片| 天天综合天天做天天综合| 91精品在线观看入口| 日本成人在线电影网| 日韩精品一区二| 国产精品亚洲а∨天堂免在线| 国产日韩欧美不卡在线| 久久91精品久久久久久秒播| 日韩精品一区国产麻豆| 成人国产一区二区三区精品| 亚洲欧洲日韩在线| 欧美日韩国产a| 免费成人av在线| 久久久天堂av| av一区二区三区黑人| 综合av第一页| 欧美日韩精品一区二区在线播放| 国产原创一区二区三区| 1000部国产精品成人观看| www.欧美日韩| 日本在线不卡视频一二三区| 26uuu精品一区二区在线观看| 99久久伊人精品| 亚洲国产毛片aaaaa无费看| 欧美一区二区啪啪| av中文字幕一区| 亚洲第一av色| 久久久精品黄色| 欧美伊人久久久久久午夜久久久久| 午夜精品福利在线| 国产精品初高中害羞小美女文| 欧美羞羞免费网站| 奇米一区二区三区av| 亚洲人精品一区| 3d动漫精品啪啪一区二区竹菊 | 欧美高清在线一区二区| 91国在线观看| 国产成人精品亚洲午夜麻豆| 一区二区三区四区视频精品免费| 色婷婷狠狠综合| 国产在线播放一区三区四| 亚洲婷婷综合色高清在线| 欧美大尺度电影在线| 99久久精品国产毛片| 免费观看在线综合| 亚洲国产人成综合网站| 国产偷国产偷精品高清尤物 | 中文字幕乱码亚洲精品一区| 欧美日韩一区不卡| 国产精品中文字幕一区二区三区| 亚洲精品视频免费观看| 久久综合色一综合色88| 欧美日韩国产电影| 玖玖九九国产精品| 亚洲一二三区在线观看| 久久精品视频网| 在线成人免费视频| 国产精品18久久久久久久久| 亚洲综合色网站| 国产精品超碰97尤物18| 精品国产露脸精彩对白 | 国产精品乱码久久久久久| 欧美变态tickle挠乳网站| 在线一区二区视频| 裸体健美xxxx欧美裸体表演| 一区二区三区 在线观看视频| 久久久久久一级片| 日韩一区二区三区高清免费看看| 色乱码一区二区三区88| 久久精品国产亚洲高清剧情介绍 | 欧美日韩成人在线| 懂色av一区二区夜夜嗨| 久久国产精品一区二区| 五月天激情综合网| 亚洲大片精品永久免费| 国产精品夫妻自拍| 精品国产污污免费网站入口| 欧美精品久久99久久在免费线| 91麻豆免费看片| 91原创在线视频| 成人av在线资源网站| 亚洲成av人片在线观看| 亚洲一区二区三区在线| 亚洲美女淫视频| 一区二区在线观看视频| 日韩一区日韩二区| 国产午夜亚洲精品羞羞网站| 久久久久久久久久久99999| 日韩精品综合一本久道在线视频| 欧美一二三四区在线| 欧美精品久久一区二区三区| 不卡影院免费观看| 91香蕉视频黄| 99久久亚洲一区二区三区青草| 91视频一区二区三区| 91蜜桃网址入口| 成人黄色a**站在线观看| 国产99久久久精品| 国产精品一区在线观看你懂的| 国内久久精品视频| 国产真实乱偷精品视频免| 精品一区精品二区高清| 国产精品一品视频| 国产98色在线|日韩| 国产99精品在线观看|