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

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

?? util.cpp

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

/* 頭文件globals.h定義了全局類型與變量 */
#include "globals.h"

#include "stdio.h"

#include "string.h"

#include "symbTable.h"

#include "code.h"

#include "cgen.h"

int  fp_num=0;    /*輸出時記錄token個數的變量*/



/*****************************************************************/
/* 函數名 printTokenlist     					        		 */	
/* 功  能 將文件tokenlist中的信息作為返回值                      */							    
/*        一般,listing指向標準輸出。                            */
/* 說  明 用于顯示詞法分析結果                                   */
/*****************************************************************/
void printTokenlist()
{
   TokenType  token;
   int m;
   
   fp=fopen("c:\\Tokenlist","rb");  /*打開文件*/
   
   if(fp==NULL)
   {
	   printf("can not open the file:Tokenlist!\n");
	   Error = TRUE;
	   //exit(0);
   }
   
   for (m=1;m<=Tokennum;m++)
   {     
	   fread(&token,TOKENLEN,1,fp);
	   
	   fprintf(listing,"\t%d: ",token.lineshow);/*打印行號*/
    
	   /* 對函數參數Lex給定單詞進行分類處理 */
       switch (token.Lex)
	   { 
	    /* 單詞token為保留字,將保留字詞元以指定格式寫入列表文件listing */
        case PROGRAM:
        case PROCEDURE:
		case TYPE:
		case VAR:
		case IF:
		case THEN:
		case ELSE:
		case FI:
		case INTEGER:
		case CHAR:
		case WHILE:
		case DO:
		case ENDWH:
		case BEGIN:
		case END:
		case READ:
		case WRITE:
		case ARRAY:
		case OF:
		case RECORD:
		case RETURN:

			fprintf(listing,     /*打印保留字*/     
                  "reserved word: %s\n",token.Sem);
            break;

	    /* 單詞token為特殊符號:ASSIGN (賦值),將":="寫入文件listing */
		case ASSIGN: fprintf(listing,":=\n"); break;
    
		/* 單詞token為特殊符號:LT (小于),將"<"寫入文件listing */
		case LT: fprintf(listing,"<\n"); break;
  
		/* 單詞token為特殊符號:EQ (等于),將"="寫入文件listing */
		case EQ: fprintf(listing,"=\n"); break;
    
		/* 單詞token為特殊符號:LPAREN (左括號),將"("寫入文件listing */
		case LPAREN: fprintf(listing,"(\n"); break;

		/* 單詞token為特殊符號:RPAREN (右括號),將")"寫入文件listing */
		case RPAREN: fprintf(listing,")\n"); break;
    
		/* 單詞token為特殊符號:SEMI (分號),將";"寫入文件listing */
		case SEMI: fprintf(listing,";\n"); break;
 
		/* 單詞token為特殊符號:PLUS (加號),將"+"寫入文件listing */
		case PLUS: fprintf(listing,"+\n"); break;
 
		/* 單詞token為特殊符號;MINUS (減號),將"-"寫入文件listing */
		case MINUS: fprintf(listing,"-\n"); break;

		/* 單詞token為特殊符號:TIMES (乘號),將"*"寫入文件listing */
		case TIMES: fprintf(listing,"*\n"); break;

		/* 單詞token為特殊符號:OVER (除號),將"/"寫入文件listing */
		case OVER: fprintf(listing,"/\n");  break;

		case DOT:  fprintf(listing,".\n"); break;

		case COMMA: fprintf(listing,",\n"); break;

		case LMIDPAREN: fprintf(listing,"[\n"); break;

		case RMIDPAREN: fprintf(listing,"]\n"); break;

		case UNDERANGE: fprintf(listing,"..\n"); break;

		/* 單詞token為簿記單詞符號:ENDFILE (文件結尾),將EOF寫入文件listing */
		case ENDFILE: fprintf(listing,"EOF\n"); break;
    
		/* 單詞token為多字符單詞符號:NUM (數字),將數值寫入文件listing */
		case INTC:
			fprintf(listing,
				"NUM, val= %s\n",token.Sem);
			 break;

		case CHARC:
			fprintf(listing,
				"INCHAR, char=%c\n",token.Sem);
			break;
    
		/* 單詞token為多字符單詞符號:ID (標識符),將標識符名寫入文件listing */
		case ID:
			 fprintf(listing,
				"ID, name= %s\n",token.Sem);
			 break;

		/* 單詞token為簿記單詞符號:ERROR (錯誤),將錯誤信息寫入文件listing */
		case ERROR:
			 fprintf(listing,
				 "ERROR: %s\n",token.Sem);
			  break;

		/* 單詞token為其他未知單詞,未知信息寫入文件listing,此種情況不應發生 */
		 default: 
			 fprintf(listing,"Unknown token: %d\n",token.Lex);
			  break;
	  
		}
		fseek(fp,m*TOKENLEN,0);
	}	      
   fprintf(listing,"\n");
   fclose(fp);
}

/*****************************************************************/
/* 函數名 ReadNextToken							        		 */	
/* 功  能 將文件tokenlist中的信息作為返回值                      */							    
/*        一般,listing指向標準輸出。                            */
/* 說  明 返回值為TokenType類型,用于語法分析中                  */
/*****************************************************************/
void ReadNextToken(TokenType *p)
{
	FILE *fp2;
   /*按只讀方式打開文件*/
   fp2=fopen("c:\\Tokenlist","rb");
   if (fp==NULL)   
         {  
			printf("cannot create file Tokenlist!\n");
			Error = TRUE;
            //exit(0);
	     }  
   fseek(fp2,fp_num*sizeof(TokenType),0);
   fread(p,sizeof(TokenType),1,fp2);
   fp_num++;
   fclose(fp2);
}

/********************************************************/
/* 函數名 copyString									*/
/* 功  能 字符串復制函數								*/
/* 說  明 該函數為已存在的字串分配內存單元,并將其復制	*/
/********************************************************/
char * copyString(char * s)

{ int n;
  char * t;

  /* 函數參數s所給字串為NULL(空), 函數返回NULL */
  if (s==NULL) return NULL;

  /* 函數參數s所給字串非空,計算字串s長度+1賦給臨時變量n */
  n = strlen(s)+1;

  /* 動態分配內存單元,指定單元長度為n,t為指向該單元的指針 */
  t = (char *)malloc(n);

  /* 單元指針t為NULL(空),未能成功分配			*
   * 將出錯信息及行號lineno寫入列表文件listing  */
  if (t==NULL)
  {
	  fprintf(listing,"Out of memory error at line %d\n",lineno);
	  Error = TRUE;
  }
  /* 調用庫函數string.h,復制給定字串s到新字串單元t */
  else strcpy(t,s);

  /* 函數返回復制得到的新字串指針t */
  return t;
}


/*****************************************************************/
/* 函數名 ChainToFile   										 */	
/* 功  能 將鏈表中的Token結點依次存入文件中                      */							    
/* 說  明  參數p是指針變量,指向Token鏈表的表頭                  */
/*****************************************************************/
void ChainToFile (ChainNodeType *Chainhead)
{ 
  int num=1;
  ChainNodeType  *currentP=Chainhead;
  /*創建一個新的文件"Tokenlist",以存儲Token序列*/
  fp=fopen("c:\\Tokenlist","wb+");
  if (fp==NULL)
         {  printf("cannot create file Tokenlist!\n");
             Error = TRUE;
			//exit(0);
	     }  
  
  fp=fopen("c:\\Tokenlist","ab");   /*按追加方式打開文件*/
    if (fp==NULL)
         {  printf("cannot open file Tokenlist!\n");
             Error = TRUE;  
			//exit(0);
	     }  
 /*從表頭到表尾,依次將所有的Token寫入文件*/ 
	do 
	{  fwrite(currentP,TOKENLEN,1,fp);
       currentP=currentP->nextToken;
       num++;
    }
    while (currentP!=NULL);

  fclose(fp);  /*關閉文件*/
}

/********************************************************
 *********以下是LL1語法分析方法所用到的棧操作************
 ********************************************************/
/*用鏈表實現棧操作,棧中存放的是終極符和非終極符,上面的兩個枚舉
  類型*/
void Push(int i,int j)
{ StackNode *p;
  p=(StackNode *)malloc(sizeof(StackNode));
  
  if (i==1)     
    (*p).var.Ntmlvar=(NontmlType)j;
  else if (i==2)
          (*p).var.tmlvar=(TmlType)j;
  
  p->flag=i;
  p->underNode=StackTop;
  StackTop=p;
  STACKEMPTY=false;
}

void  Pop()
{ StackNode *p;
  p=StackTop;
  StackTop=(*StackTop).underNode;
  free(p);
  if (StackTop==NULL)
	  STACKEMPTY=true;
}

/*讀棧頂標志,看是終極符還是非終極符*/
int readStackflag()
{ int j;
  j=StackTop->flag ;
  return(j);
}

/*非終極符時*/
NontmlType readstackN()
{
  return ((*StackTop).var.Ntmlvar);
}

/*終極符*/
TmlType readstackT()
{
  return ((*StackTop).var.tmlvar);
}


/*壓棧的實現過程,壓入的是指向樹節點的指針的地址*/
void  PushPA(TreeNode **t)
{
	StackNodePA *p=NULL;
    p=(StackNodePA *)malloc (sizeof(StackNodePA));
	p->pointer= t ;
	p->underNode =StackTopPA;
    StackTopPA=p;
    paSTACKEMPTY=false;
}
/*彈棧的實現過程*/
TreeNode ** PopPA()
{     
  StackNodePA  *p=NULL;
  TreeNode   **backpointer;
  p = StackTopPA;
  backpointer=p ->pointer;
  StackTopPA=StackTopPA->underNode;
  free(p);
  if (StackTopPA==NULL)
	  paSTACKEMPTY=true;

  return backpointer;
}


/*操作符棧的壓棧實現過程,壓入的是指向樹節點的指針*/
void  PushOp(TreeNode *t)
{
	StackNodeP *p=NULL;
    p=(StackNodeP *)malloc (sizeof(StackNodeP));
	p->pointer= t ;
	p->underNode =OpStackTop;
    OpStackTop=p;
	OpSTACKEMPTY=FALSE;
}

/*操作符棧的彈棧實現過程*/
TreeNode * PopOp()
{     
  StackNodeP *p=NULL;
  TreeNode   *backpointer;
  p=OpStackTop;
  backpointer=p->pointer;
  OpStackTop=OpStackTop->underNode;
  free(p);
  if (OpStackTop==NULL)
	  OpSTACKEMPTY= TRUE;

  return backpointer;
}

LexType ReadOpStack()
{
	TreeNode *t1;
	t1=OpStackTop->pointer;
    return (t1->attr.ExpAttr.op);
}
/*操作數棧的壓棧實現過程,壓入的是指向樹節點的指針*/
void  PushNum(TreeNode *t)
{
	StackNodeP *p=NULL;
    p =(StackNodeP *)malloc (sizeof(StackNodeP));
	p->pointer= t ;
	p->underNode =NumStackTop;
    NumStackTop=p;
	NumSTACKEMPTY=false;
}
/*操作數棧的彈棧實現過程*/
TreeNode * PopNum()
{     
  StackNodeP  *p=NULL;
  TreeNode    *backpointer;
  p =NumStackTop;
  backpointer=p->pointer;
  NumStackTop=NumStackTop->underNode;
  free(p);
  if (NumStackTop==NULL)
	  NumSTACKEMPTY=true;

  return backpointer;
}
 



/********************************************************
 *********以下是創建語法樹所用的各類節點的申請***********
 ********************************************************/

/********************************************************/
/* 函數名 newRootNode									*/	
/* 功  能 創建語法樹根節點函數			        		*/
/* 說  明 該函數為語法樹創建一個新的根結點      		*/
/*        并將語法樹節點成員初始化						*/
/********************************************************/
TreeNode * newRootNode(void)

{
  /* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));

  int i;
  
  /* 語法樹節點指針t為NULL,未能成功分配內存單元 *
   * 將出錯信息及行號lineno寫入列表文件listing  */
  if (t==NULL)
  {
	  fprintf(listing,"Out of memory error at line %d\n",lineno);
	   Error = TRUE;
  }
  /* 語法樹節點指針t不是NULL,成功分配內存單元 */
  else {

	/* 初始化新語法樹節點t各子節點child[i]為NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新語法樹節點t兄弟節點sibling為NULL */
	t->sibling = NULL;
    
	/* 指定新語法樹節點t成員:結點類型nodekind為語句類型ProK */
	t->nodekind = ProK;
    
	/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
	t->lineno = lineno;

	for(i=0;i<10;i++) 
	{
		strcpy(t->name[i],"\0");
		t->table[i] = NULL;
	}

  }
  /* 函數返回語法樹根節點指針t */
  return t;
}


/********************************************************/
/* 函數名 newPheadNode									*/	
/* 功  能 創建程序頭類型語法樹節點函數					*/
/* 說  明 該函數為語法樹創建一個新的程序頭類型結點		*/
/*        并將語法樹節點成員初始化						*/
/********************************************************/
TreeNode * newPheadNode(void)

{
  /* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
  TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));

  int i;
  
  /* 語法樹節點指針t為NULL,未能成功分配內存單元 *
   * 將出錯信息及行號lineno寫入列表文件listing  */
  if (t==NULL)
  {
	  fprintf(listing,"Out of memory error at line %d\n",lineno);
	   Error = TRUE;
  }
  /* 語法樹節點指針t不是NULL,成功分配內存單元 */
  else {

	/* 初始化新語法樹節點t各子節點child[i]為NULL */
    for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;

	/* 初始化新語法樹節點t兄弟節點sibling為NULL */
	t->sibling = NULL;
    
	/* 指定新語法樹節點t成員:結點類型nodekind為語句類型PheadK */
	t->nodekind = PheadK;
    
	/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
	t->lineno = lineno;
    
	t->idnum = 0;

	for(i=0;i<10;i++) 
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区精品婷婷| 亚洲一级二级在线| 1区2区3区欧美| 日本女人一区二区三区| 菠萝蜜视频在线观看一区| 5月丁香婷婷综合| 亚洲欧美怡红院| 国产综合久久久久久鬼色| 欧美人伦禁忌dvd放荡欲情| 中文字幕一区在线观看视频| 看片网站欧美日韩| 7777精品久久久大香线蕉| 国产精品污www在线观看| 老汉av免费一区二区三区| 欧美色中文字幕| 亚洲免费av观看| av电影在线观看一区| 国产欧美一区二区精品秋霞影院| 蜜臀久久99精品久久久久久9| 91国产福利在线| 国产精品久久久久aaaa| 国产suv一区二区三区88区| 精品国产乱码久久久久久图片 | 午夜久久久久久久久| 99久久精品免费观看| 国产日韩欧美不卡| 国产.欧美.日韩| 久久久久9999亚洲精品| 九九九精品视频| 2023国产精华国产精品| 久久99精品一区二区三区三区| 欧美一区二区三区免费在线看| 香蕉久久夜色精品国产使用方法 | 亚洲精品久久嫩草网站秘色| 成人午夜电影网站| 久久精品视频网| 国产精品1024| 欧美国产视频在线| 不卡的av网站| 亚洲卡通动漫在线| 欧美综合天天夜夜久久| 亚洲成人动漫在线观看| 欧美日韩国产大片| 美腿丝袜亚洲三区| 久久综合狠狠综合| 高清免费成人av| 中文字幕在线观看不卡| 在线视频你懂得一区| 日韩影院在线观看| 久久综合中文字幕| www.欧美日韩| 午夜影院在线观看欧美| 欧美一区二区三区在线电影| 久久99精品视频| 国产精品网站在线观看| 91国内精品野花午夜精品| 天天综合网天天综合色| 精品国产123| 成人av在线播放网站| 一二三四社区欧美黄| 91精品国产色综合久久ai换脸 | 成人app软件下载大全免费| 亚洲视频在线观看一区| 欧美日韩精品二区第二页| 久久国内精品视频| 亚洲素人一区二区| 日韩视频免费观看高清完整版 | 精品视频一区 二区 三区| 久久不见久久见免费视频7 | 精品国内二区三区| 不卡高清视频专区| 日韩精品午夜视频| 日韩一区有码在线| 日韩欧美电影一区| 91免费在线播放| 久久99精品视频| 亚洲夂夂婷婷色拍ww47| 欧美www视频| 色婷婷久久久亚洲一区二区三区 | 亚洲精品你懂的| 精品卡一卡二卡三卡四在线| 色综合欧美在线视频区| 国产精品伊人色| 五月婷婷综合在线| 中文字幕欧美一| 日韩女优制服丝袜电影| 91国产视频在线观看| 成人美女在线观看| 国产做a爰片久久毛片| 婷婷丁香激情综合| 一片黄亚洲嫩模| 中文成人综合网| 久久久精品人体av艺术| 欧美片在线播放| 日本黄色一区二区| 99久久综合国产精品| 国产精品18久久久久久久久久久久| 天天影视涩香欲综合网| 亚洲欧美国产77777| 国产精品成人免费在线| 久久人人爽人人爽| 日韩三级在线免费观看| 欧美伦理视频网站| 欧美日韩亚洲综合一区| 欧洲av在线精品| 91福利在线看| 在线观看亚洲专区| 色婷婷一区二区三区四区| av高清久久久| 91麻豆国产精品久久| av成人老司机| 91在线国产福利| 91在线视频在线| 色94色欧美sute亚洲线路一久| 91蜜桃视频在线| 色天天综合久久久久综合片| 色婷婷狠狠综合| 91成人在线精品| 欧美三级电影在线观看| 91麻豆精品国产91久久久使用方法| 欧美亚一区二区| 欧美久久久久免费| 日韩亚洲欧美综合| 26uuu精品一区二区在线观看| 精品国产乱码久久久久久图片| 精品国产欧美一区二区| 国产亚洲欧美一区在线观看| 精品99久久久久久| 久久久久国产精品麻豆| 国产精品不卡在线| 亚洲美女视频在线| 天堂一区二区在线| 久久99精品国产麻豆婷婷洗澡| 激情都市一区二区| 丁香亚洲综合激情啪啪综合| 91色|porny| 欧美一区二区国产| 欧美激情一区二区三区在线| 亚洲精品欧美专区| 免费成人在线观看视频| 国产jizzjizz一区二区| 91九色最新地址| 日韩一区二区三区免费看 | 一区二区在线观看免费| 亚洲成人动漫在线观看| 国模无码大尺度一区二区三区| 国产白丝精品91爽爽久久| 在线免费亚洲电影| 26uuu国产电影一区二区| 日韩毛片一二三区| 日产国产高清一区二区三区| 国产乱妇无码大片在线观看| 色婷婷激情久久| 亚洲精品一区二区在线观看| 亚洲伦理在线精品| 韩国一区二区视频| 欧美亚洲愉拍一区二区| 2023国产一二三区日本精品2022| 亚洲视频一二三区| 九九国产精品视频| 在线看国产一区| 国产视频在线观看一区二区三区| 一区二区三区四区精品在线视频| 日本aⅴ亚洲精品中文乱码| 播五月开心婷婷综合| 日韩一级完整毛片| 亚洲黄色录像片| 成人久久视频在线观看| 91精品国产黑色紧身裤美女| 国产精品久久国产精麻豆99网站| 蜜乳av一区二区三区| 欧美视频一二三区| 中文字幕一区不卡| 亚洲bt欧美bt精品| 99re这里只有精品6| 久久久久久久久久久黄色 | 亚洲欧美另类小说| 国产一区二区三区黄视频| 欧美日韩小视频| 亚洲激情欧美激情| 99久久久免费精品国产一区二区| 欧美精品一区二区不卡 | 精品污污网站免费看| 国产亚洲精品7777| 乱中年女人伦av一区二区| 欧美日韩三级在线| 亚洲一二三区在线观看| 91视频免费看| 国产精品网友自拍| 国产东北露脸精品视频| 精品少妇一区二区三区| 日本不卡1234视频| 日韩欧美成人激情| 美女一区二区三区在线观看| 欧美一区二区三区性视频| 五月天一区二区三区| 911精品国产一区二区在线| 夜夜爽夜夜爽精品视频| 欧美性三三影院| 亚洲狠狠爱一区二区三区|