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

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

?? parse.cpp

?? snl編譯器 開發(fā)環(huán)境visual c
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/****************************************************/
/* 文件 parse.c										*/
/* 說明 TINY編譯器的語法分析器實現(xiàn)					*/
/* 主題 編譯器結構:原理和實例						*/
/****************************************************/

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

#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 .     */
/* 說  明 函數根據文法產生式,調用相應的遞歸處理函數,生成語法樹節(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;
}

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

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


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


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


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


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


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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91免费版在线看| 91精选在线观看| 欧美日韩aaa| 久久久亚洲国产美女国产盗摄 | 国产丶欧美丶日本不卡视频| 色999日韩国产欧美一区二区| 欧美一区二区三区思思人| 国产精品美女视频| 久久精品二区亚洲w码| 在线亚洲人成电影网站色www| 26uuu另类欧美| 日韩经典一区二区| 色狠狠一区二区三区香蕉| 国产欧美精品一区aⅴ影院 | 国产欧美一区在线| 青青草97国产精品免费观看无弹窗版 | 欧美日韩夫妻久久| 亚洲欧洲av一区二区三区久久| av成人免费在线| 欧美成人aa大片| 丝袜美腿成人在线| 欧美日韩美少妇| 亚洲国产乱码最新视频| 日本韩国一区二区三区| 亚洲欧美激情插| 99re66热这里只有精品3直播| 国产亚洲自拍一区| 风间由美一区二区三区在线观看| 欧美精品一区二区在线观看| 视频一区二区欧美| 宅男噜噜噜66一区二区66| 婷婷激情综合网| 欧美精品粉嫩高潮一区二区| 午夜成人在线视频| 91麻豆精品91久久久久久清纯| 日本欧美在线看| 日韩精品一区二区三区在线观看| 爽好久久久欧美精品| 欧美一区二区三区免费视频| 蜜桃视频在线观看一区| 久久这里只精品最新地址| 久久国产视频网| 国产色产综合色产在线视频| 国产精品一区二区x88av| 国产婷婷色一区二区三区在线| 国产精品一区二区久久不卡| 国产精品美女久久久久av爽李琼 | 五月天激情综合网| 欧美一级片免费看| 国模套图日韩精品一区二区 | 在线不卡的av| 国产一区二区三区四区五区美女 | 欧美精品三级日韩久久| 秋霞电影网一区二区| 精品国产网站在线观看| 豆国产96在线|亚洲| 自拍av一区二区三区| 欧美性生活一区| 精品一区二区久久久| 国产精品乱子久久久久| 欧美日韩精品综合在线| 精品一区二区三区久久| 成人欧美一区二区三区黑人麻豆| 欧美视频中文一区二区三区在线观看 | 在线观看国产精品网站| 日韩精彩视频在线观看| 国产色一区二区| 欧美午夜电影网| 国产成人在线影院| 亚洲一区二区三区小说| 久久奇米777| 欧美日韩一本到| 国产成人在线视频免费播放| 亚洲影视资源网| 国产欧美精品一区二区色综合朱莉 | 亚洲黄色性网站| 日韩欧美高清在线| 91国产精品成人| 国产在线精品免费| 亚洲3atv精品一区二区三区| 国产亚洲成年网址在线观看| 欧美亚洲图片小说| 9色porny自拍视频一区二区| 日本伊人精品一区二区三区观看方式| 国产日韩欧美电影| 91精品国产欧美日韩| 色av成人天堂桃色av| 国产福利电影一区二区三区| 日本aⅴ精品一区二区三区 | 9色porny自拍视频一区二区| 久久91精品国产91久久小草| 亚洲资源中文字幕| 国产精品伦一区| 久久久久久久综合狠狠综合| 宅男在线国产精品| 欧美夫妻性生活| 欧美在线你懂得| 色综合天天性综合| 成人av片在线观看| 成人污视频在线观看| 国产一区在线观看麻豆| 麻豆精品蜜桃视频网站| 日韩av成人高清| 丝袜美腿亚洲综合| 亚洲成人三级小说| 亚洲午夜在线电影| 亚洲在线视频一区| 亚洲午夜av在线| 亚洲一区二区三区中文字幕在线| 亚洲三级在线看| 亚洲欧洲制服丝袜| 国产精品不卡一区| 亚洲视频网在线直播| 亚洲欧美综合网| 亚洲免费观看高清完整版在线观看| 国产免费成人在线视频| 国产精品免费视频一区| 国产精品不卡一区| 亚洲欧洲制服丝袜| 亚洲综合区在线| 亚洲v中文字幕| 日本欧美一区二区在线观看| 日本va欧美va瓶| 国产精品影视在线| 成人免费毛片aaaaa**| 99久久伊人精品| 欧美性一二三区| 日韩视频免费观看高清完整版在线观看 | 日韩精品一区国产麻豆| 精品国产露脸精彩对白| 久久亚洲精品国产精品紫薇| 国产区在线观看成人精品| 国产精品久久福利| 亚洲国产精品天堂| 久久99久久99| 国产成人免费av在线| 一本色道久久综合狠狠躁的推荐| 欧美在线观看视频一区二区| 91精品久久久久久蜜臀| 欧美成人女星排名| 亚洲欧洲国产专区| 首页亚洲欧美制服丝腿| 国产乱淫av一区二区三区| 成a人片亚洲日本久久| 欧美日本一区二区| 久久久99精品免费观看不卡| 亚洲欧美日韩国产综合在线| 日韩黄色免费网站| 国产成人啪免费观看软件| 欧美在线短视频| 久久综合国产精品| 亚洲综合丁香婷婷六月香| 国产美女精品人人做人人爽| 色综合久久久久网| 日韩久久久精品| 亚洲精品免费一二三区| 捆绑调教一区二区三区| 色乱码一区二区三区88| 欧美精品一区二区精品网| 亚洲欧洲综合另类在线| 极品少妇xxxx偷拍精品少妇| 色先锋资源久久综合| 精品国产一区二区三区不卡 | 国产日韩欧美一区二区三区乱码 | 亚洲人成在线观看一区二区| 日韩国产成人精品| 大胆欧美人体老妇| 日韩一区二区三区免费看| 日韩一区在线播放| 国产乱子伦一区二区三区国色天香| 在线观看网站黄不卡| 久久久久久亚洲综合| 免费观看日韩av| 欧洲一区在线电影| 自拍偷拍亚洲激情| 成人午夜在线免费| 久久天堂av综合合色蜜桃网| 香蕉久久夜色精品国产使用方法| 懂色av一区二区三区免费看| 欧美一区二区三区公司| 亚洲五月六月丁香激情| aaa国产一区| 中文字幕一区av| 丁香网亚洲国际| 久久精品综合网| 国产在线精品一区二区夜色| 日韩一区二区在线播放| 午夜久久久影院| 色94色欧美sute亚洲13| 欧美激情一区在线| 国产一区二区三区四区五区入口| 欧美一区二区三区小说| 日韩av不卡在线观看| 欧美乱熟臀69xxxxxx| 亚洲国产精品一区二区久久 | 国产精品一卡二| 日韩欧美aaaaaa| 久久国产精品72免费观看| 日韩欧美一区二区不卡| 另类专区欧美蜜桃臀第一页|