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

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

?? parse.cpp

?? snl編譯器 開發環境visual c
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/****************************************************/
/* 文件 parse.c										*/
/* 說明 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一区二区三区免费野_久草精品视频
91福利在线播放| 国产欧美日本一区视频| 精品动漫一区二区三区在线观看| 亚洲国产高清不卡| 五月天欧美精品| 99re8在线精品视频免费播放| 日韩免费性生活视频播放| 亚洲色欲色欲www| 国产精品亚洲一区二区三区妖精 | 久久理论电影网| 亚洲永久免费av| 成人午夜在线免费| 亚洲精品在线观看网站| 天天操天天综合网| 欧洲一区二区三区在线| 中文字幕中文在线不卡住| 国产乱码字幕精品高清av| 欧美一区二区三区免费在线看| 亚洲与欧洲av电影| 欧洲另类一二三四区| 国产精品美女久久久久av爽李琼| 激情综合色综合久久综合| 欧美一卡2卡三卡4卡5免费| 亚洲aaa精品| 欧美日韩久久一区二区| 一区二区三区在线观看国产| 99久久精品国产网站| 国产精品久久久久久久蜜臀| 国产aⅴ精品一区二区三区色成熟| 精品福利一二区| 国产麻豆91精品| 国产亚洲一二三区| 国产xxx精品视频大全| 国产欧美精品一区二区色综合朱莉| 黄页网站大全一区二区| www国产成人| 国产成人av资源| 久久精品人人做人人爽人人| 国产成人一区在线| 国产精品乱码一区二区三区软件 | 日韩欧美第一区| 蜜臀va亚洲va欧美va天堂| 日韩无一区二区| 九九九精品视频| 欧美国产精品一区| 一本大道综合伊人精品热热| 一区二区三区四区视频精品免费 | 91极品视觉盛宴| 亚洲午夜久久久久久久久电影网 | 99精品热视频| 亚洲最色的网站| 69堂精品视频| 国产在线国偷精品产拍免费yy| 国产日产欧美一区二区视频| 色综合天天性综合| 狠狠狠色丁香婷婷综合久久五月| 精品播放一区二区| av亚洲产国偷v产偷v自拍| 一区二区三区欧美| 91精品国产黑色紧身裤美女| 国产麻豆9l精品三级站| √…a在线天堂一区| 欧美电影在线免费观看| 国产电影一区二区三区| 亚洲精品中文在线| 日韩三级高清在线| 99精品桃花视频在线观看| 日韩精品一级中文字幕精品视频免费观看 | 成人精品国产福利| 亚洲国产成人av网| 久久夜色精品国产欧美乱极品| 成人免费毛片高清视频| 亚洲成人你懂的| 中文字幕va一区二区三区| 欧美日韩视频在线一区二区 | 99这里都是精品| 人禽交欧美网站| 国产精品不卡在线| 精品精品国产高清一毛片一天堂| 91伊人久久大香线蕉| 久久69国产一区二区蜜臀| 一区二区三区丝袜| 国产精品入口麻豆原神| 日韩欧美一级特黄在线播放| 一本到不卡免费一区二区| 国产一区二区三区国产| 婷婷久久综合九色综合伊人色| 国产精品久久久久aaaa樱花 | 亚洲mv在线观看| 欧美国产日韩a欧美在线观看| 欧美乱熟臀69xxxxxx| 91在线免费视频观看| 国产福利电影一区二区三区| 秋霞电影网一区二区| 一区二区三区久久久| 欧美国产一区二区在线观看| 精品国产91洋老外米糕| 欧美精品xxxxbbbb| 欧美手机在线视频| 一本色道综合亚洲| av在线播放成人| 成人动漫中文字幕| 成人久久久精品乱码一区二区三区| 美国毛片一区二区三区| 日韩一区精品视频| 首页国产欧美日韩丝袜| 亚洲一区中文日韩| 亚洲综合激情小说| 一区二区欧美国产| 伊人开心综合网| 一个色综合av| 亚洲一级二级三级| 麻豆免费精品视频| 黄色资源网久久资源365| 美女视频一区二区| 久久成人免费电影| 美国一区二区三区在线播放| 美腿丝袜亚洲一区| 久久99在线观看| 国产一区二区免费看| 国产乱码精品一区二区三区av| 国产在线国偷精品免费看| 国产成人超碰人人澡人人澡| 成人在线视频首页| 色天天综合色天天久久| 欧美在线视频日韩| 欧美一卡2卡三卡4卡5免费| 精品免费国产一区二区三区四区| 欧美精品一区二区三区久久久| 国产亚洲精品久| 亚洲免费三区一区二区| 午夜精品久久久久久久蜜桃app| 视频一区二区中文字幕| 久久超碰97人人做人人爱| 国产精品资源站在线| caoporm超碰国产精品| 色老汉一区二区三区| 欧美疯狂性受xxxxx喷水图片| 日韩精品一区二区三区四区视频| 久久这里只有精品首页| 国产精品国模大尺度视频| 亚洲小少妇裸体bbw| 久久精品免费观看| av在线一区二区三区| 在线播放中文字幕一区| 亚洲精品在线三区| 亚洲精选在线视频| 久久精品国产澳门| 99re热这里只有精品免费视频| 欧美在线短视频| 精品福利一区二区三区| 亚洲黄色小视频| 久久丁香综合五月国产三级网站 | 国产精品1区2区3区| 一本大道综合伊人精品热热| 日韩欧美国产高清| 亚洲精品大片www| 久久精品国产99久久6| 色婷婷综合久久久久中文一区二区 | 精久久久久久久久久久| 色综合视频一区二区三区高清| 日韩欧美久久一区| 亚洲欧美国产毛片在线| 国产一区二区三区久久悠悠色av| 在线欧美日韩国产| 欧美国产日韩精品免费观看| 视频一区中文字幕| 在线观看一区日韩| 久久精品欧美日韩精品| 青青草91视频| 91久久一区二区| 国产精品久久午夜夜伦鲁鲁| 蜜桃传媒麻豆第一区在线观看| 欧美在线免费观看亚洲| 国产精品你懂的| 国产精品亚洲人在线观看| 欧美一区二区三区在线看| 一区二区免费视频| 97se亚洲国产综合自在线| 久久婷婷久久一区二区三区| 日本午夜精品一区二区三区电影 | 一区二区三区欧美久久| 成人激情免费视频| 国产亚洲精品免费| 国产最新精品免费| 日韩你懂的在线观看| 天堂在线亚洲视频| 欧美日韩一区二区在线观看视频| 亚洲欧美成人一区二区三区| 丁香婷婷综合激情五月色| 精品国产精品网麻豆系列| 美女尤物国产一区| 日韩一卡二卡三卡| 青青草成人在线观看| 欧美一级生活片| 另类小说综合欧美亚洲| 日韩精品资源二区在线| 久久不见久久见免费视频1| 日韩三级中文字幕| 精品影视av免费|