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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? parse.cpp

?? 編譯原理學習使用的代碼 內容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/****************************************************/
/* 文件 parse.cpp									*/
/* 說明 TINY編譯器的語法分析器實現					*/
/* 主題 編譯器結構:原理和實例						*/
/****************************************************/

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

#include "globals.h"	

#include "util.h"		

#include "scanner.h"	

#include "parse.h"		

#include "string.h"

static TokenType token;

char * temp_name;

static int line0;

/********** 遞歸調用的函數原型 ************/

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);			/* 處理表達式函數 */

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

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

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

static TreeNode * variable(void);

static void variMore(TreeNode * t);

static TreeNode * fieldvar(void);

static void fieldvarMore(TreeNode * t );

         

/************ 語法分析功能函數 **************/

/********************************************************************/
/* 函數名 syntaxError												*/
/* 功  能 語法錯誤處理函數											*/
/* 說  明 將函數參數message指定的錯誤信息格式化寫入列表文件listing	*/
/*		  設置錯誤追蹤標志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;
}

/********************************************************************/
/* 函數名 match														*/
/* 功  能 終極符匹配處理函數										*/
/* 說  明 函數參數expected給定期望單詞符號與當前單詞符號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);
  }
  
}

/********************************************************************/
/* 函數名 program												    */
/* 功  能 總程序的處理函數								        	*/
/* 產生式 < program > ::= programHead declarePart programBody .     */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/*        語法樹的根節點的第一個子節點指向程序頭部分programHead,    */
/*        DeclaraPart為programHead的兄弟節點,程序體部分programBody  */
/*        為declarePart的兄弟節點.                                  */
/********************************************************************/
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;
}

/********************************************************************/
/* 函數名 programHead											    */
/* 功  能 程序頭的處理函數								        	*/
/* 產生式 < programHead > ::= PROGRAM  ProgramName                  */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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;
}	
    
/*************************聲明部分***********************************/

/********************************************************************/
/* 函數名 declarePart											    */
/* 功  能 聲明部分的處理函數								     	*/
/* 產生式 < declarePart > ::= typeDec  varDec  procDec              */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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;
		 }
     }
	 /*函數*/
	 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;
}



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

/********************************************************************/
/* 函數名 typeDec									     		    */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < typeDec > ::= ε | TypeDeclaration                      */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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;
}
		  
	 
/********************************************************************/
/* 函數名 TypeDeclaration									  	    */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < TypeDeclaration > ::= TYPE  TypeDecList                 */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
TreeNode * typeDeclaration(void)
{
	match(TYPE);
	TreeNode * t = typeDecList();
	if (t==NULL)
	{
        syntaxError("a type declaration is expected!");
	}
	return t;
}


/********************************************************************/
/* 函數名 TypeDecList		 							  	        */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < TypeDecList > ::= typeId = typeName ; typeDecMore       */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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;
}


/********************************************************************/
/* 函數名 typeDecMore		 							            */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < typeDecMore > ::=    ε | TypeDecList                   */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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;
}


/********************************************************************/
/* 函數名 typeId		 							  	            */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < typeId > ::= id                                         */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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);
}


/********************************************************************/
/* 函數名 typeName		 							  	            */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < typeName > ::= baseType | structureType | id            */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */
/********************************************************************/
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;
		  } 
}


/********************************************************************/
/* 函數名 baseType		 							  	            */
/* 功  能 類型聲明部分的處理函數						        	*/
/* 產生式 < baseType > ::=  INTEGER | CHAR                          */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節點  */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本成人在线视频网站| 欧美精品一区二区不卡| 自拍偷拍国产精品| 99热精品一区二区| 亚洲欧美日韩在线播放| 91色在线porny| 亚洲精品视频一区二区| 欧美色综合网站| 午夜精品成人在线视频| 欧美一区二区三区在线观看 | 三级欧美韩日大片在线看| 欧美亚男人的天堂| 蜜臀久久久久久久| 精品日韩欧美一区二区| 成人免费视频网站在线观看| 亚洲精品国产高清久久伦理二区| 欧美影院一区二区三区| 毛片一区二区三区| 中文字幕免费不卡在线| 欧美怡红院视频| 美女视频黄 久久| 国产精品少妇自拍| 欧美精品1区2区| 国产成人在线免费观看| 亚洲免费av在线| 日韩欧美在线一区二区三区| 成人午夜av影视| 五月激情六月综合| 国产欧美精品在线观看| 欧美色综合影院| 国产成人精品免费| 亚洲bdsm女犯bdsm网站| 国产人成一区二区三区影院| 欧美精品乱码久久久久久按摩 | 国产91精品久久久久久久网曝门| 有码一区二区三区| 精品1区2区在线观看| 91久久精品日日躁夜夜躁欧美| 精品一区精品二区高清| 亚洲小说欧美激情另类| 国产亚洲精品aa午夜观看| 欧美日韩一本到| 99精品国产视频| 国产精品一区三区| 午夜精品爽啪视频| 国产精品美女久久久久久久久| 日韩欧美三级在线| 91久久久免费一区二区| 成人三级在线视频| 精品一区二区三区香蕉蜜桃| 亚洲va韩国va欧美va| 综合自拍亚洲综合图不卡区| 久久久影视传媒| 日韩三级伦理片妻子的秘密按摩| 欧美影片第一页| 日本道在线观看一区二区| 成人免费看的视频| 国产综合成人久久大片91| 婷婷开心激情综合| 伊人色综合久久天天| 国产精品美女久久久久久| 国产日韩欧美精品电影三级在线| 日韩一级免费观看| 69av一区二区三区| 欧美日本韩国一区| 欧美视频三区在线播放| 色综合中文字幕| 99在线精品观看| 99精品视频在线观看| 成人激情免费电影网址| 国产成人8x视频一区二区| 国产一区二区免费视频| 国产精品伊人色| 国产成人在线电影| 高清在线不卡av| 国产一区二区久久| 国产·精品毛片| 成人黄色免费短视频| 国产成人福利片| 成人综合激情网| 菠萝蜜视频在线观看一区| www.在线成人| 在线一区二区视频| 欧美三级中文字| 日韩一区二区高清| 久久亚洲综合色| 国产女人水真多18毛片18精品视频| 国产欧美日本一区二区三区| 国产精品免费人成网站| 成人免费一区二区三区视频| 亚洲欧美另类图片小说| 亚洲一区二区三区四区在线| 日韩中文字幕一区二区三区| 蜜臀av亚洲一区中文字幕| 国产一区亚洲一区| av亚洲精华国产精华精华| 在线视频你懂得一区二区三区| 欧美日韩视频在线第一区| 日韩视频免费观看高清完整版在线观看| 日韩一区二区三区视频在线| 久久亚洲影视婷婷| 亚洲图片激情小说| 亚洲成a天堂v人片| 国产一区福利在线| av一区二区三区在线| 欧美老肥妇做.爰bbww视频| 欧美成人精品3d动漫h| 欧美国产在线观看| 亚洲国产精品久久艾草纯爱| 乱中年女人伦av一区二区| 国产91精品一区二区麻豆网站| 在线精品亚洲一区二区不卡| 欧美v国产在线一区二区三区| 国产精品久久国产精麻豆99网站| 亚洲超碰精品一区二区| 粉嫩av亚洲一区二区图片| 欧美性色黄大片| 国产网站一区二区| 亚洲一区二区三区国产| 国产精品自拍网站| 在线观看日韩电影| 久久久久国产精品厨房| 亚洲成人激情自拍| 豆国产96在线|亚洲| 91精品国产综合久久蜜臀| 国产精品久久三区| 日本怡春院一区二区| 99免费精品视频| 欧美成人女星排名| 一区二区三区国产精华| 国产99久久久久久免费看农村| 欧美精品久久99久久在免费线| 国产精品蜜臀在线观看| 日韩av电影一区| 91国产丝袜在线播放| 国产欧美一区在线| 麻豆91精品视频| 欧美日本一区二区三区四区| 国产精品伦一区二区三级视频| 蜜桃91丨九色丨蝌蚪91桃色| 色久综合一二码| 国产精品日日摸夜夜摸av| 久久狠狠亚洲综合| 欧美放荡的少妇| 亚洲精品国产无天堂网2021 | 亚洲丝袜精品丝袜在线| 国产乱码精品一区二区三区av | 久久久久国产精品麻豆ai换脸| 日韩精品三区四区| 色94色欧美sute亚洲线路一久| 国产亚洲精品久| 国产在线国偷精品免费看| 91精品国产综合久久久蜜臀图片 | 国产精品麻豆视频| 国产一区二区女| 欧美变态tickle挠乳网站| 亚洲成人黄色影院| 欧美性大战久久久久久久蜜臀| 中文字幕一区二区三区在线不卡| 国产成人在线视频免费播放| 久久综合国产精品| 国产一区91精品张津瑜| 精品日韩欧美在线| 狠狠色丁香久久婷婷综合丁香| 日韩欧美中文字幕一区| 美女视频黄频大全不卡视频在线播放| 欧美精品xxxxbbbb| 日产国产高清一区二区三区| 欧美人妇做爰xxxⅹ性高电影| 亚洲大片免费看| 欧美肥妇毛茸茸| 免费成人在线网站| 欧美成人一级视频| 国产又黄又大久久| 国产精品女主播在线观看| 99国产精品国产精品久久| 亚洲女子a中天字幕| 欧美性感一类影片在线播放| 午夜欧美大尺度福利影院在线看| 欧美浪妇xxxx高跟鞋交| 蜜乳av一区二区| 精品伦理精品一区| 国产91丝袜在线播放0| 综合色天天鬼久久鬼色| 欧美日韩一区二区三区不卡 | 国内精品免费在线观看| 国产丝袜在线精品| 91在线你懂得| 亚洲18色成人| 26uuu亚洲综合色| 高清不卡在线观看| 亚洲视频一二区| 欧美丰满少妇xxxxx高潮对白| 激情六月婷婷综合| 国产精品理伦片| 欧美视频中文一区二区三区在线观看| 三级影片在线观看欧美日韩一区二区 | 亚洲精品日韩一| 91精品国产色综合久久不卡电影| 国内成+人亚洲+欧美+综合在线|