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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? scanner.cpp

?? snl編譯器 開發(fā)環(huán)境visual c
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):

/****************************************************/
/* 文件	scanner.cpp								*/
/* 說明 TINY編譯器的詞法掃描器實(shí)現(xiàn)					*/
/* 主題 編譯器結(jié)構(gòu):原理和實(shí)例						*/
/****************************************************/

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

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

#include "string.h"

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

#include "util.h"		/* 該頭文件util.h定義了相關(guān)功能函數(shù) */

#include "math.h"       /* 用到了這個(gè)庫里的取模運(yùn)算 */

/*****************詞法分析器確定性有限自動(dòng)機(jī)DFA的狀態(tài)類型*************/				             
/* START 開始狀態(tài); INASSIGN 賦值狀態(tài); INRANGE 下標(biāo)范圍狀態(tài);          */
/* INNUM 數(shù)字狀態(tài); INID 標(biāo)識(shí)符狀態(tài); DONE 完成狀態(tài);                   */
/* INCHAR 字符狀態(tài);INCOMMENT 注釋狀態(tài);                               */
typedef enum
   { START,INASSIGN,INRANGE,INCOMMENT,INNUM,INID,INCHAR,DONE }
   StateType;


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


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


/* lineBuf為當(dāng)前輸入代碼行緩沖區(qū) */
static char lineBuf[BUFLEN];


/* linepos為在代碼緩沖區(qū)LineBuf中的當(dāng)前字符位置,初始為0 */
static int linepos = 0;


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


/* EOF_flag當(dāng)為文件尾時(shí),改變函數(shù)ungetNextChar功能 */
static int EOF_flag = FALSE;




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

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

	  /* 輸入行緩沖區(qū)lineBuf中當(dāng)前字符位置linepos指向lineBuf開始位置 */
	  linepos = 0;

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

    }
    else
	{ 
	  /* 未能成功讀入新的代碼行,fget函數(shù)返回值為NULL *
	   * 已經(jīng)到源代碼文件末尾,設(shè)置EOF_flag標(biāo)志為TRUE */
	  EOF_flag = TRUE;					

   	  /* 函數(shù)返回EOF */
	  return EOF;
    }
  }

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


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

{
  /* 如果EOF_flag標(biāo)志為FALSE,不是處于源文件末尾  *
   * 輸入行緩沖區(qū)lineBuf中當(dāng)前字符位置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}  };
      


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

{ 
  int i;

  /* 在保留字表中查找,MAXRESERVED已經(jīng)定義為8,為保留字?jǐn)?shù) */
  for (i=0;i<MAXRESERVED;i++)				

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

		/* 字符串s與保留字表中某一表項(xiàng)匹配,函數(shù)返回對(duì)應(yīng)保留字單詞 */
		return reservedWords[i].tok;			

  /* 字符串s未在保留字表中找到,函數(shù)返回標(biāo)識(shí)符單詞ID */
  return ID;								
}


/****************************************
 ********* 詞法掃描器基本函數(shù)  **********
 ****************************************/

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

void getTokenlist(void)

{ 
   ChainNodeType *chainHead;    /*鏈表的表頭指針*/
   ChainNodeType *currentNode;  /*指向處理當(dāng)前Token的當(dāng)前結(jié)點(diǎn)*/
   ChainNodeType *preNode;      /*指向當(dāng)前結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)*/
   ChainNodeType *tempNode;     /*臨時(shí)指針,用于釋放鏈表部分*/
   TokenType currentToken;      /*存放當(dāng)前的Token*/

   /*產(chǎn)生鏈表的第一個(gè)結(jié)點(diǎn)*/   
   chainHead=preNode=currentNode=(ChainNodeType *)malloc(CHAINNODELEN);
   /*初始化當(dāng)前結(jié)點(diǎn)中,指向下一個(gè)結(jié)點(diǎn)的指針為空*/
   (*currentNode).nextToken=NULL;

   do 
   {  /* tokenStringIndex用于記錄當(dāng)前正在識(shí)別單詞的詞元存儲(chǔ)區(qū) *
	   * tokenString中的當(dāng)前正在識(shí)別字符位置,初始為0          */
       int tokenStringIndex = 0;
   
      /* 當(dāng)前狀態(tài)標(biāo)志state,始終都是以START作為開始 */
       StateType state = START;

      /* tokenString的存儲(chǔ)標(biāo)志save,整數(shù)類型						*
       * 決定當(dāng)前識(shí)別字符是否存入當(dāng)前識(shí)別單詞詞元存儲(chǔ)區(qū)tokenString */
       int save;

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

    	/* 當(dāng)前正識(shí)別字符的存儲(chǔ)標(biāo)志save初始為TRUE */
         save = TRUE;					

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

           /* 當(dāng)前字符c為數(shù)字,當(dāng)前DFA狀態(tài)state設(shè)置為數(shù)字狀態(tài)INNUM *
	        * 確定性有限自動(dòng)機(jī)DFA處于數(shù)字類型單詞中               */
	     	 if (isdigit(c))				
               state = INNUM;				
   
	       /* 當(dāng)前字符c為字母,當(dāng)前DFA狀態(tài)state設(shè)置為標(biāo)識(shí)符狀態(tài)INID *
		    * 確定性有限自動(dòng)機(jī)DFA處于標(biāo)識(shí)符類型單詞中              */
             else if (isalpha(c))
                   state = INID;				

	       /* 當(dāng)前字符c為冒號(hào),當(dāng)前DFA狀態(tài)state設(shè)置為賦值狀態(tài)INASSIGN *
		    * 確定性有限自動(dòng)機(jī)DFA處于賦值類型單詞中				   */
             else if (c == ':')
                  state = INASSIGN;		
  		 
	       /* 當(dāng)前字符c為.,當(dāng)前DFA狀態(tài)state設(shè)置為數(shù)組下標(biāo)界限狀態(tài)*/
	       /* INRANGE,確定性有限自動(dòng)機(jī)DFA處于數(shù)組下標(biāo)界限類型單詞中*/                         
		     else if (c == '.')
		         state = INRANGE;

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

		   /* 當(dāng)前字符c為左括號(hào),字符存儲(chǔ)標(biāo)志save設(shè)置為FALSE     *
		    * 當(dāng)前DFA狀態(tài)state設(shè)置為注釋狀態(tài)INCOMMENT			  *	
		    * 確定性有限自動(dòng)機(jī)DFA處于注釋中,不生成單詞,無需存儲(chǔ) */
             else if (c == '{')
			 { 
				 save = FALSE;
                 state = INCOMMENT;			
			 }

	       /* 當(dāng)前字符c為其它字符,當(dāng)前DFA狀態(tài)state設(shè)置為完成狀態(tài)DONE *
	        * 確定性有限自動(dòng)機(jī)DFA處于單詞的結(jié)束位置,需進(jìn)一步分類處理 */
             else

			 { 
				 state = DONE;				
                 switch (c)
				 {
			      /* 當(dāng)前字符c為EOF,字符存儲(chǔ)標(biāo)志save設(shè)置為FALSE,無需存儲(chǔ)     *
			       * 當(dāng)前識(shí)別單詞返回值currentToken設(shè)置為文件結(jié)束單詞ENDFILE */
		           case EOF:
                   save = FALSE;
                   currentToken.Lex = ENDFILE;
                   break;					

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线不卡中文字幕| 亚洲国产日产av| 国产乱码精品一区二区三| 日韩一区二区三区免费看| 日韩成人一区二区三区在线观看| 欧美日韩国产综合久久| 日本女优在线视频一区二区| 日韩一区二区三区在线视频| 国内偷窥港台综合视频在线播放| 久久久五月婷婷| 成人一级黄色片| 中文字幕亚洲欧美在线不卡| 色哟哟一区二区在线观看| 亚洲一区视频在线观看视频| 91精品国模一区二区三区| 美腿丝袜亚洲一区| 国产日韩综合av| 一本色道**综合亚洲精品蜜桃冫 | 国产在线精品一区二区不卡了| wwwwww.欧美系列| 成av人片一区二区| 亚洲高清免费一级二级三级| 日韩一级片在线观看| 精品伊人久久久久7777人| 欧美国产欧美亚州国产日韩mv天天看完整| 北岛玲一区二区三区四区| 亚洲伊人色欲综合网| 欧美va亚洲va香蕉在线| av色综合久久天堂av综合| 亚洲动漫第一页| 91亚洲国产成人精品一区二三| 中文字幕在线不卡| 国产成人精品一区二| 中文字幕欧美激情| 欧美亚洲国产怡红院影院| 另类的小说在线视频另类成人小视频在线| 久久综合久久综合久久综合| caoporm超碰国产精品| 午夜日韩在线电影| 国产女主播一区| 欧美精品在线一区二区| 成人免费高清在线| 人人狠狠综合久久亚洲| 自拍偷拍欧美激情| 日韩精品一区二| 色哟哟精品一区| 国产精品一区二区你懂的| 亚洲一区二区视频在线观看| 国产亚洲一区二区三区四区| 欧美日韩不卡一区二区| 成人动漫精品一区二区| 久久精品国产**网站演员| 一区二区三区日本| 国产偷v国产偷v亚洲高清| 在线不卡中文字幕| 日本电影欧美片| 成人sese在线| 国产一区欧美二区| 日本亚洲电影天堂| 韩国精品一区二区| 视频一区视频二区中文| 亚洲色图一区二区三区| 欧美国产日韩在线观看| 久久综合国产精品| 日韩一区二区精品在线观看| 欧美日韩综合一区| 色久综合一二码| 99re热视频这里只精品| 国产成人福利片| 国产又黄又大久久| 韩国毛片一区二区三区| 另类小说视频一区二区| 视频一区二区三区在线| 亚洲在线观看免费视频| 亚洲老司机在线| 亚洲久本草在线中文字幕| 中文字幕亚洲综合久久菠萝蜜| 久久久精品一品道一区| 26uuu精品一区二区| 精品国产髙清在线看国产毛片| 制服丝袜亚洲播放| 69堂亚洲精品首页| 91麻豆精品91久久久久同性| 在线不卡a资源高清| 91精品国产福利| 欧美一级一区二区| 欧美r级电影在线观看| 2023国产精品自拍| 国产蜜臀av在线一区二区三区| 久久精品一级爱片| 中文幕一区二区三区久久蜜桃| 欧美国产精品一区| 国产精品成人免费在线| 亚洲激情图片一区| 午夜电影网一区| 日韩精品成人一区二区三区| 蜜臀久久99精品久久久画质超高清 | 综合av第一页| 一区二区欧美视频| 日日夜夜免费精品视频| 欧美色大人视频| 日韩免费视频一区| 亚洲国产精品传媒在线观看| 久久精品夜色噜噜亚洲a∨| 亚洲摸摸操操av| 中文字幕中文字幕一区| 高清成人在线观看| av激情亚洲男人天堂| 91激情五月电影| 正在播放亚洲一区| 日本一区二区在线不卡| 亚洲欧美一区二区三区极速播放 | 国产精品久久久久永久免费观看 | 在线观看视频一区二区欧美日韩 | 日韩亚洲欧美在线| www.亚洲色图.com| 日韩欧美中文字幕精品| 成人午夜激情影院| 99久久久精品| 69久久夜色精品国产69蝌蚪网| 日韩女优av电影在线观看| 国产精品网站在线| 亚洲国产精品久久艾草纯爱| 极品少妇xxxx偷拍精品少妇| 99国产精品久久久久久久久久久| 欧美日韩中文国产| 国产亚洲精品免费| 亚洲成人资源网| 床上的激情91.| 欧美精品久久久久久久久老牛影院| 久久久午夜精品理论片中文字幕| 亚洲精品国产精品乱码不99 | 亚洲国产成人tv| 国产老妇另类xxxxx| 欧美在线小视频| 国产欧美一二三区| 亚洲va国产天堂va久久en| 国产精品 欧美精品| 欧美三级在线播放| 中文字幕一区二区三区四区| 久久精品国产99国产| 色域天天综合网| 国产欧美日韩另类一区| 免费精品视频在线| 日本乱人伦aⅴ精品| 国产欧美日韩不卡| 蜜乳av一区二区| 欧美老肥妇做.爰bbww视频| 国产精品福利影院| 国产一区二区三区香蕉| 欧美一区二区大片| 亚洲国产一区在线观看| 91在线小视频| 国产精品狼人久久影院观看方式| 麻豆精品新av中文字幕| 欧美性猛交xxxxxx富婆| 中文字幕色av一区二区三区| 国产精品夜夜爽| 久久亚洲二区三区| 蜜臀91精品一区二区三区| 蜜臂av日日欢夜夜爽一区| 99国产一区二区三精品乱码| 精品久久人人做人人爽| 日韩中文欧美在线| 欧美日产在线观看| 亚洲一区二区视频在线| 久久精品日韩一区二区三区| 国内精品伊人久久久久av影院| 欧美一区二区女人| 蜜臀精品一区二区三区在线观看 | 亚洲综合一二区| 色噜噜狠狠色综合中国| 亚洲欧美一区二区三区孕妇| 91浏览器入口在线观看| 亚洲欧美日韩电影| 色噜噜狠狠色综合中国| 亚洲国产综合人成综合网站| 欧美亚洲一区二区三区四区| 亚洲国产一区二区视频| 欧美午夜精品久久久| 天堂蜜桃91精品| 日韩一区二区三区四区| 精品一区二区免费在线观看| 久久久久久久综合| 成人晚上爱看视频| 亚洲欧美国产毛片在线| 欧美色国产精品| 奇米精品一区二区三区四区| 精品免费视频.| 成人午夜伦理影院| 亚洲激情自拍偷拍| 制服丝袜成人动漫| 精品一区二区三区在线观看国产| 久久久亚洲综合| a在线欧美一区| 亚洲成人动漫精品| 精品理论电影在线| 99久久精品国产导航| 亚洲.国产.中文慕字在线| 欧美成人猛片aaaaaaa|