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

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

?? scanner.cpp

?? 編譯原理學習使用的代碼 內容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

/****************************************************/
/* 文件	scanner.cpp								*/
/* 說明 TINY編譯器的詞法掃描器實現					*/
/* 主題 編譯器結構:原理和實例						*/
/****************************************************/

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

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

#include "string.h"

#include "ctype.h"      /* 用到了該庫中的isalnum,isalpha,isdigit函數 */

#include "util.h"		/* 該頭文件util.h定義了相關功能函數 */

#include "math.h"       /* 用到了這個庫里的取模運算 */

/*****************詞法分析器確定性有限自動機DFA的狀態類型*************/				             
/* START 開始狀態; INASSIGN 賦值狀態; INRANGE 下標范圍狀態;          */
/* INNUM 數字狀態; INID 標識符狀態; DONE 完成狀態;                   */
/* INCHAR 字符狀態;INCOMMENT 注釋狀態;                               */
typedef enum
   { START,INASSIGN,INRANGE,INCOMMENT,INNUM,INID,INCHAR,DONE }
   StateType;


/* tokenString用于保存標識符和保留字單詞的詞元,長度41 */
char tokenString[MAXTOKENLEN+1];


/* BUFLEN源代碼行的輸入緩沖區長度為256 */
#define BUFLEN 256


/* lineBuf為當前輸入代碼行緩沖區 */
static char lineBuf[BUFLEN];


/* linepos為在代碼緩沖區LineBuf中的當前字符位置,初始為0 */
static int linepos = 0;


/* bufsize為當前緩沖器中所存字串大小 */
static int bufsize = 0;


/* EOF_flag當為文件尾時,改變函數ungetNextChar功能 */
static int EOF_flag = FALSE;




/*******************************************************************/
/* 函數名 getNextChar											   */
/* 功  能 取得下一非空字符函數									   */	
/* 說  明 該函數從輸入緩沖區lineBuf中取得下一個非空字符		       */
/*        如果lineBuf中的字串已經讀完,則從源代碼文件中讀入一新行   */
/*******************************************************************/
static int getNextChar(void)
{ 
   /* 當前代碼輸入行緩沖器lineBuf已經耗盡 */
   if (!(linepos < bufsize))				

   {
	/* 源代碼行號lineno加1 */
    lineno++;
    
    /* 從源文件source中讀入BUFLEN-2(254)個字符到行緩沖區lineBuf中      *
	 * fgets在的lineBuf末尾保留換行符.并在末尾加了一個NULL字符表示結束 */
	if (fgets(lineBuf,BUFLEN-1,source))	
    
	{ 	 
	  /* 如果源文件追蹤標志EchoSource為TRUE                               *
	   * 將源程序行號lineno及行內容lineBuf在詞法掃描時寫入列表文件listing */
	  if (EchoSource) fprintf(listing,"%4d: %s",lineno,lineBuf);
	  
	  /* 取得當前輸入源代碼行的實際長度,送給變量bufsize */
	  bufsize = strlen(lineBuf);

	  /* 輸入行緩沖區lineBuf中當前字符位置linepos指向lineBuf開始位置 */
	  linepos = 0;

	  /* 取得輸入行緩沖區lineBuf中下一字符 */
      return lineBuf[linepos++];

    }
    else
	{ 
	  /* 未能成功讀入新的代碼行,fget函數返回值為NULL *
	   * 已經到源代碼文件末尾,設置EOF_flag標志為TRUE */
	  EOF_flag = TRUE;					

   	  /* 函數返回EOF */
	  return EOF;
    }
  }

  /* 行輸入緩沖區lineBuf中字符還未讀完,直接取其中下一字符,函數返回所取字符 */
  else return lineBuf[linepos++];
}


/********************************************************/
/* 函數名 ungetNextChar									*/		
/* 功  能 字符回退函數									*/
/* 說  明 該過程在行輸入緩沖區lineBuf中回退一個字符		*/
/*        用于超前讀字符后不匹配時候的回退				*/
/********************************************************/
static void ungetNextChar(void)

{
  /* 如果EOF_flag標志為FALSE,不是處于源文件末尾  *
   * 輸入行緩沖區lineBuf中當前字符位置linepos減1 */
  if (!EOF_flag) linepos-- ;
}


/******************* 保留字查找表 ********************/

static struct
    { char*   str;
      LexType tok;				
    } reservedWords[MAXRESERVED]
	= { {"program",PROGRAM},{"type",TYPE},{"var",VAR},{"procedure",PROCEDURE}
	   ,{"begin",BEGIN},{"end",END},{"array",ARRAY},{"of",OF},{"record",RECORD}
       ,{"if",IF},{"then",THEN},{"else",ELSE},{"fi",FI},{"while",WHILE}
	   ,{"do",DO},{"endwh",ENDWH},{"read",READ},{"write",WRITE},{"return",RETURN}
	   ,{"integer",INTEGER},{"char",CHAR}  };
      


/**************************************************************/
/* 函數名 reservedLookup								      */
/* 功  能 保留字查找函數									  */
/* 說  明 使用線性查找,查看一個標識符是否是保留字			  */
/*		  標識符如果在保留字表中則返回相應單詞,否則返回單詞ID */
/**************************************************************/
static LexType  reservedLookup (char * s)

{ 
  int i;

  /* 在保留字表中查找,MAXRESERVED已經定義為8,為保留字數 */
  for (i=0;i<MAXRESERVED;i++)				

	/* 線性查保留字表,察看函數參數s指定標識符是否在表中 *
	 * 當兩字符串匹配的時候,函數strcmp返回值為0(FALSE)	*/ 
    if (!strcmp(s,reservedWords[i].str))	

		/* 字符串s與保留字表中某一表項匹配,函數返回對應保留字單詞 */
		return reservedWords[i].tok;			

  /* 字符串s未在保留字表中找到,函數返回標識符單詞ID */
  return ID;								
}


/****************************************
 ********* 詞法掃描器基本函數  **********
 ****************************************/

/************************************************************/
/* 函數名 getTokenlist						   			    */
/* 功  能 取得單詞函數										*/
/* 說  明 函數從源文件字符串序列中獲取所有Token序列 		*/
/*        使用確定性有限自動機DFA,采用直接轉向法    		*/
/*        超前讀字符,對保留字采用查表方式識別    			*/
/*        產生詞法錯誤時候,僅僅略過產生錯誤的字符,不加改正  */
/************************************************************/

void getTokenlist(void)

{ 
   ChainNodeType *chainHead;    /*鏈表的表頭指針*/
   ChainNodeType *currentNode;  /*指向處理當前Token的當前結點*/
   ChainNodeType *preNode;      /*指向當前結點的前驅結點*/
   ChainNodeType *tempNode;     /*臨時指針,用于釋放鏈表部分*/
   TokenType currentToken;      /*存放當前的Token*/

   /*產生鏈表的第一個結點*/   
   chainHead=preNode=currentNode=(ChainNodeType *)malloc(CHAINNODELEN);
   /*初始化當前結點中,指向下一個結點的指針為空*/
   (*currentNode).nextToken=NULL;

   do 
   {  /* tokenStringIndex用于記錄當前正在識別單詞的詞元存儲區 *
	   * tokenString中的當前正在識別字符位置,初始為0          */
       int tokenStringIndex = 0;
   
      /* 當前狀態標志state,始終都是以START作為開始 */
       StateType state = START;

      /* tokenString的存儲標志save,整數類型						*
       * 決定當前識別字符是否存入當前識別單詞詞元存儲區tokenString */
       int save;

      /* 當前確定性有限自動機DFA狀態state不是完成狀態DONE */
      while (state != DONE)
   
	  { 
        /* 從源代碼文件中獲取下一個字符,送入變量c作為當前字符 */
    	 int c = getNextChar();

    	/* 當前正識別字符的存儲標志save初始為TRUE */
         save = TRUE;					

         switch (state)
		 { 
	       /* 當前DFA狀態state為開始狀態START,DFA處于當前單詞開始位置 */
            case START:

           /* 當前字符c為數字,當前DFA狀態state設置為數字狀態INNUM *
	        * 確定性有限自動機DFA處于數字類型單詞中               */
	     	 if (isdigit(c))				
               state = INNUM;				
   
	       /* 當前字符c為字母,當前DFA狀態state設置為標識符狀態INID *
		    * 確定性有限自動機DFA處于標識符類型單詞中              */
             else if (isalpha(c))
                   state = INID;				

	       /* 當前字符c為冒號,當前DFA狀態state設置為賦值狀態INASSIGN *
		    * 確定性有限自動機DFA處于賦值類型單詞中				   */
             else if (c == ':')
                  state = INASSIGN;		
  		 
	       /* 當前字符c為.,當前DFA狀態state設置為數組下標界限狀態*/
	       /* INRANGE,確定性有限自動機DFA處于數組下標界限類型單詞中*/                         
		     else if (c == '.')
		         state = INRANGE;

	    	 
	       /* 當前字符c為',當前DFA狀態state設置為字符標志狀態*/
	       /* INCHAR,確定性有限自動機DFA處于字符標志類型單詞中*/
			 else if (c == '\'')
			 {  
				 save = FALSE;
		         state = INCHAR;
			 }
		   
		    /* 當前字符c為空白(空格,制表符,換行符),字符存儲標志save設置為FALSE *
		     * 當前字符為分隔符,不需要產生單詞,無須存儲                        */
             else if ((c == ' ') || (c == '\t') || (c == '\n'))
                 save = FALSE;				

		   /* 當前字符c為左括號,字符存儲標志save設置為FALSE     *
		    * 當前DFA狀態state設置為注釋狀態INCOMMENT			  *	
		    * 確定性有限自動機DFA處于注釋中,不生成單詞,無需存儲 */
             else if (c == '{')
			 { 
				 save = FALSE;
                 state = INCOMMENT;			
			 }

	       /* 當前字符c為其它字符,當前DFA狀態state設置為完成狀態DONE *
	        * 確定性有限自動機DFA處于單詞的結束位置,需進一步分類處理 */
             else

			 { 
				 state = DONE;				
                 switch (c)
				 {
			      /* 當前字符c為EOF,字符存儲標志save設置為FALSE,無需存儲     *
			       * 當前識別單詞返回值currentToken設置為文件結束單詞ENDFILE */
		           case EOF:
                   save = FALSE;
                   currentToken.Lex = ENDFILE;
                   break;					

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品视频在线播放观看| 五月综合激情网| 久久久久国产成人精品亚洲午夜| 精彩视频一区二区三区| 亚洲高清在线精品| **网站欧美大片在线观看| 26uuu欧美| 精品国精品国产尤物美女| 色悠悠久久综合| 99热99精品| 成人18精品视频| 粗大黑人巨茎大战欧美成人| 国产精品中文字幕一区二区三区| 人人狠狠综合久久亚洲| 日韩**一区毛片| 老司机午夜精品| 国产一本一道久久香蕉| 国产成人在线观看免费网站| 成人av在线资源网| 色综合中文字幕国产 | 欧美精品一区二| 久久久国产综合精品女国产盗摄| 国产午夜精品理论片a级大结局| 中文字幕av一区二区三区| 国产精品成人一区二区艾草| 亚洲精品高清在线| 午夜免费久久看| 久久精品国产久精国产| 国产suv精品一区二区883| 欧美性videosxxxxx| 欧美日韩国产另类不卡| 精品国产1区二区| 日本视频一区二区| 精品一区二区三区在线播放视频| a4yy欧美一区二区三区| 欧美日韩一区二区在线观看视频 | av亚洲产国偷v产偷v自拍| 色综合久久九月婷婷色综合| 91精品久久久久久久久99蜜臂| 精品国产一区二区亚洲人成毛片| 中文字幕国产一区| 奇米一区二区三区| 色悠悠久久综合| 国产日韩欧美综合在线| 日韩成人免费看| 色综合久久中文字幕综合网| 久久久久国产免费免费| 亚洲无人区一区| 91女厕偷拍女厕偷拍高清| 久久精品欧美日韩| 91热门视频在线观看| 日本久久一区二区| 日韩一区二区三区四区 | 日本一区二区三区免费乱视频| 五月婷婷另类国产| 91蜜桃免费观看视频| 欧美国产精品专区| 久久99精品一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 26uuu色噜噜精品一区二区| 天堂精品中文字幕在线| 7777精品伊人久久久大香线蕉完整版| 成人欧美一区二区三区视频网页 | 日韩电影在线观看电影| 欧美日韩另类一区| 午夜欧美视频在线观看| 在线视频中文字幕一区二区| 亚洲三级视频在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 久久精品一区八戒影视| 成人免费高清在线观看| 亚洲视频一区二区免费在线观看| 99久久综合精品| 亚洲mv在线观看| 久久综合999| 91在线视频在线| 一区二区三区加勒比av| 欧美精品第1页| 国产福利视频一区二区三区| 亚洲欧洲日韩一区二区三区| 欧美男男青年gay1069videost| 喷水一区二区三区| 久久精品视频一区二区三区| 国产91精品免费| 午夜精品福利在线| 久久中文字幕电影| 色综合天天综合网天天看片| 亚洲伊人色欲综合网| av网站一区二区三区| 中文字幕日韩av资源站| 在线免费亚洲电影| 麻豆一区二区三| 一区免费观看视频| 91精品国产品国语在线不卡| 国产精品一区二区久激情瑜伽| 亚洲欧美日韩成人高清在线一区| 欧美午夜寂寞影院| 国产在线精品免费| 亚洲成av人综合在线观看| 91精品啪在线观看国产60岁| 成人av手机在线观看| 经典一区二区三区| 一区二区三区美女视频| 国产三级一区二区三区| 欧美伦理影视网| 99久久99久久精品免费看蜜桃| 国产中文一区二区三区| 亚洲一区二区不卡免费| 国产精品电影一区二区| 久久综合狠狠综合久久激情| 4438x亚洲最大成人网| 色婷婷av一区二区| 99国产欧美久久久精品| 国产91精品久久久久久久网曝门| 视频一区二区中文字幕| 一区二区国产视频| 椎名由奈av一区二区三区| 久久久久免费观看| 国产欧美日韩综合精品一区二区| 日韩欧美在线综合网| 欧美三级在线看| 日本大香伊一区二区三区| 欧美va亚洲va| 精品国产一区二区三区av性色| 欧美一区二区视频观看视频 | 亚洲精品少妇30p| 亚洲欧美自拍偷拍| 午夜欧美在线一二页| 亚洲成人动漫av| 午夜av区久久| 麻豆精品一区二区综合av| 日韩精品免费专区| 丁香激情综合国产| 一本色道久久加勒比精品| 欧美亚一区二区| 欧美一级精品大片| 精品伦理精品一区| 亚洲伦在线观看| 亚洲综合在线视频| 美女脱光内衣内裤视频久久网站| 美日韩一级片在线观看| 国产美女娇喘av呻吟久久| 成人午夜私人影院| 日韩欧美精品在线视频| 国产日韩欧美综合在线| 一区二区三区免费看视频| 免费成人在线网站| 国产成人免费视频精品含羞草妖精| 欧美无人高清视频在线观看| 精品美女在线观看| 亚洲一区视频在线观看视频| 狠狠色综合色综合网络| 从欧美一区二区三区| 欧美一级高清大全免费观看| 中文字幕一区二区三| 男男gaygay亚洲| 91丨porny丨在线| 欧美日韩一区精品| 亚洲日穴在线视频| 国产精品香蕉一区二区三区| 欧美日韩小视频| 亚洲视频图片小说| 国产成人av电影| 制服丝袜亚洲色图| 亚洲观看高清完整版在线观看 | 中文字幕一区二区三区在线播放| 免费高清不卡av| 精品视频色一区| 亚洲欧美日韩电影| 激情小说欧美图片| 精品国产凹凸成av人网站| 婷婷久久综合九色综合伊人色| 在线精品亚洲一区二区不卡| 欧美国产综合色视频| 蜜臀久久99精品久久久久宅男| 555夜色666亚洲国产免| 天天亚洲美女在线视频| 欧美巨大另类极品videosbest | 久久久久久久久蜜桃| 国产高清无密码一区二区三区| 欧美成人乱码一区二区三区| 日韩精品久久理论片| 91麻豆精品91久久久久久清纯| 亚洲美女视频在线观看| 欧美日韩日日摸| 日韩国产在线观看一区| 日韩午夜三级在线| 美女任你摸久久| 国产视频一区不卡| 大胆亚洲人体视频| 亚洲色图视频网| 欧美午夜电影在线播放| 亚洲动漫第一页| 亚洲国产精品传媒在线观看| 99久久婷婷国产精品综合| 亚洲小少妇裸体bbw| 7777精品伊人久久久大香线蕉经典版下载| 国产一区二区三区免费播放| 亚洲欧美日韩综合aⅴ视频| 欧美日本视频在线|