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

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

?? word_analysis.c

?? 一個(gè)C語言的詞法分析器
?? C
字號(hào):
/*++
	module name: word_analysis.c  
	kernel module of linear scan
--*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  /* strtol(,,)  */
#include "symbol_table.h"
#include "error_.h"

/* the maximum file size */
#define	 MAX_FILE_SIZE	(1024*100)
/**********************************************************/
char		*p_char  = NULL;
int			pre_type = TYPE_UNDEF;
char		str_tem[MAX_LENGTH] = "";
char		file_buffer[MAX_FILE_SIZE] = ""; 
/**********************************************************/
/* copy certain file to buffer and attach our global pointer to file buffer */
int file_to_buffer(char *filename)
{
	FILE *pfile;
	int  i  = 0;
	pfile = fopen(filename, "r" );
	if( pfile == NULL ) /* bad file name */
		return FALSE;
	do
	{
		file_buffer[i++] = fgetc(pfile );
	}while( file_buffer[i-1] != EOF );
	/* 將文件內(nèi)容寫入緩沖區(qū) 并寫入字符串結(jié)尾符  */
	file_buffer[i-1] = '\0';
	/* we don't need pfile any more             */
	fclose(pfile );
	/* attach our char_pointer to file buffer   */
	p_char = file_buffer;
	return TRUE;
}
/*  if we've got to the end of file */
int is_end  (void)
{
	return (*p_char == EOF || *p_char == '\0') ? TRUE : FALSE;
}
/* 當(dāng)前字符指針p_char自加 如果當(dāng)前字符為文件結(jié)尾 返回錯(cuò)誤 */
int pop_char(void)
{
	if( *p_char == EOF || *p_char == '\0' )
		return FALSE;
	p_char++;
	return TRUE;
}
/* need more testing... */
/* 當(dāng)前字符若不屬于合法Token的一部分 則將當(dāng)前字符指針指向下一個(gè)合法Tolen首符 */
/* 如果到達(dá)源文件字串的結(jié)尾 返回FALSE */
int goto_token(void)
{
	do
	{
		switch( *p_char )
		{/* fgetc func cannot get '\r', it only get '\n' */
		case '\n':
			line++;  /* fall through */	
		case ' ' :  
		case '\t' :	/* 處理空格 制表符 回車 換行符 */
			if( !pop_char() )  /* 到達(dá)串結(jié)尾 */
				return FALSE;
			else               /* 繼續(xù) 處理下一字符 */
				break;
		case '/'  :  /*  處理注釋   */
			if( *(p_char+1) == '*' )   /* C style comment */
			{
				p_char += 2;
				while( !(*p_char == '*' && *(p_char+1) == '/') )
				{
					if(  *(p_char+1) == '\n' /* &&  *p_char == '\r' */ ) 
						line++;		/* fgetc func cannot get '\r', it only get '\n' */
					if( !pop_char() )
						return FALSE;
				}
				p_char += 2;   /* skip '*' and '/' */
				break;
			}
			else if( *(p_char+1) == '/' ) /* C++ style comment */
			{
				p_char += 2;    /* skip "//" */
				/* fgetc func cannot get '\r', it only get '\n' */
				while( !(*p_char == '\n') )   /* stop at the end of each line */ 
					if( !pop_char() )
						return FALSE;
			/*	p_char += 2;   */ /* go to next line  */
				pop_char();		  /* we only need to skip '\n', there's no '\r' any more */
				line++;
				break;
			}
			else			/* 不是注釋 退出 */
				return TRUE;
		default:     /* 當(dāng)前字符屬于某個(gè)Token */
			return TRUE;
		}
	}while(TRUE);
}
/**********************************************************************/
/* some functions for certain char *p_char judging  */
/* 是否為空格 */
int is_blank(void)      /* is *p_char a blank */
{
	return *p_char == ' ' ;
}
/* 是否為制表符 */
int is_tab  (void)
{
	return *p_char == '\t' ;
}
/* 是否為數(shù)字 */
int is_digit (void)
{
	if( *p_char >=48 && *p_char <=57 )    /* 0-9 */
		return TRUE;
	else 
		return FALSE;
}
/* 是否為字母 或許該將下劃線作為字母 */
int is_letter(void)
{
	if( *p_char >= 65 && *p_char <= 90 )    	/* A-Z */
		return TRUE;
	else if( *p_char >= 97 && *p_char <= 122 )	/* a-z */
		return TRUE;
	else if( *p_char == '_' )
		return TRUE;
	else 
		return FALSE;
}
/* 是否為保留字 */
int is_reserve(char *str)
{
	ENTRY entry = { TYPE_UNDEF, NULL };
	entry = query_reserve_table(str );
	return entry.p_item == NULL ? FALSE : TRUE ;
}
/* 是否為界符 包括運(yùn)算符 */
int is_specifier(void)    /* 界符 */
{
	char str[2] = { *p_char, '\0' };
	ENTRY entry = { TYPE_UNDEF, NULL };
	entry = query_specifier_table(str );
	return entry.p_item == NULL ? FALSE : TRUE ;
	
}
/* 判斷是否為合法轉(zhuǎn)義字符 從'\\'后面第一個(gè)字符開始分析 若不合法 返回FALSE		*/
/* 合法則返回TRUE,并將轉(zhuǎn)義字符的值寫入p_c指向的字符 將字符指針指向后一個(gè)字符   */
/* 但不檢查該字符是否為 '\'' 此工作交給Deal_single來做                          */
int is_tranmean (char *p_c)
{
	char tem[4] = "";
	int  i      = 0 ;
	switch( *p_char )
	{
	case 'n':
			*p_c = '\n';
			pop_char();		/* skip to ' */
			return TRUE;
	case 't':
			*p_c = '\t';
			pop_char();		/* skip to ' */
			return TRUE;
	case 'b':
			*p_c = '\b';
			pop_char();		/* skip to ' */
			return TRUE;
	case 'r':
			*p_c = '\r';
			pop_char();		/* skip to ' */
			return TRUE;
	case 'f':
			*p_c = '\f';
			pop_char();		/* skip to ' */
			return TRUE;
	case '\\':	/* fall through */
	case '\'':
	case '\"':
			*p_c = *p_char;
			pop_char();		/* skip to ' */
			return TRUE;
	case 'x':
		{/*  \xdd  */
			pop_char();
			/* 0-9 a-f A-F */
			if( ! (is_digit() || (*p_char >= 65 && *p_char <= 70)
				|| (*p_char >= 97 && *p_char <= 102)) )
				return FALSE;
			for( i = 0; is_digit() || (*p_char >= 65 && *p_char <= 70)
				|| (*p_char >= 97 && *p_char <= 102); i++ )
			{/* 0-9 a-f A-F \xdd */
				if( i > 1 )
					return FALSE;
				tem[i] = *p_char;
				pop_char();
			}
			*p_c =(char) strtol(tem, NULL, 16 );
			return TRUE;
		}
	default:
		{	
			if( !is_digit() ) /* !(0-9) */
				return FALSE;
			/*  0-9  \ddd */
			for( i = 0; is_digit() ; i++ )
			{
				if( i > 2 )
					return FALSE;
				tem[i] = *p_char;
				pop_char();
			}
			*p_c =(char) strtol(tem, NULL, 10 );
			return TRUE;
		}/* default */
	}/* switch */
}
/****************************************************************/
/* some functions deal with certain type  */
ENTRY deal_specifier (void)    /* 處理界符 */
{
	ENTRY entry        = { TYPE_UNDEF, NULL };
	/* 假設(shè)界符和運(yùn)算符最多兩個(gè)字符 */
	char  str_tem[3]   = { *p_char, *(p_char+1), '\0' }; 
	
	entry = query_specifier_table(str_tem );
	if( entry.type == TYPE_UNDEF )
	{
		str_tem[1] = '\0';
		entry = query_specifier_table(str_tem );
	}
	else
		pop_char();
	pop_char();
	strcpy(str_tem, "" );  /* clear the str_tem array for next call */
	pre_type = entry.type; /* 為判斷+ 和- 的意義做準(zhǔn)備 */
	return entry;
}
/* 處理字符串常量 將其添加入字符串常量表 */
ENTRY deal_double_   (void) 	/* "		*/
{
	int i;
	ENTRY entry;
	pop_char();  /* skip the first " */
	/* stop when meet another " except \"  */
	for(i=0; !(*p_char == '\"' && *(p_char-1) != '\\'); i++ )
	{/* 可能的錯(cuò)誤 缺少配對(duì)的 " */
		/* fgetc func cannot get '\r', it only get '\n' */
		if(	*p_char == '\\' )
		{
			pop_char();
			if( is_tranmean(str_tem +i ) )
				continue;
			else
				p_char--;	/* back to pre char  */
		}
		if( /* *p_char == '\r' && */ *(p_char+1) == '\n' )
		{
			pop_char();  /*  go to \n, next pop_char make us go to next line */
			report_error(ERROR_ILLEGAL_STR, line++, NULL );
			break;
		}
		str_tem[i] = *p_char;
		pop_char();
	}
	str_tem[i] = '\0';
	entry.p_item = add_cst_str(str_tem );
	entry.type   = TYPE_CONST_STR;
	pop_char();            /*  get out of this token  */
	strcpy(str_tem, "" );  /* clear the str_tem array for next call */
	pre_type = entry.type; /* 為判斷+ 和- 的意義做準(zhǔn)備 */
	return entry;
}	
/* 處理字符常量  */
ENTRY deal_single_   (void) 	/* '		*/
{
	ENTRY entry = { TYPE_UNDEF, NULL };
	pop_char();  /* skip the first ' */
	if( *p_char != '\\' )
	{
		str_tem[0] = *p_char;
		if( *(p_char+1) != '\'' )
		/* 出現(xiàn)錯(cuò)誤 沒有另一個(gè)匹配的' 或非轉(zhuǎn)義字符并且含多個(gè)字符 */
		{
			report_error(ERROR_ILLEGAL_CHAR, line, NULL );
			/* 不再向后搜索'\'',只提示出錯(cuò)位置和類型 */
			/* 該行剩余部分不再分析 跳至下一行 */
			while( *p_char != '\n' )
				if( !pop_char() )
					break;
			line++;
		}
		else
			pop_char();
	}
	else
	{	/* 處理轉(zhuǎn)義字符  */
		pop_char();		/* skip out of '\' */
		if( !is_tranmean(str_tem ) || *p_char != '\'' )
		{/* 非法轉(zhuǎn)義字符 */
			report_error(ERROR_ILLEGAL_CHAR, line, NULL );
			/* 不再向后搜索'\'',只提示出錯(cuò)位置和類型 */
			/* 該行剩余部分不再分析 跳至下一行       */
			while( *p_char != '\n' )
				if( !pop_char() )
					break;
			line++;
		}
		/* else , do nothing...                         */
		/* is_tranmean() 已將轉(zhuǎn)義字符值寫入str_tem[0]   */		
	}
	entry.p_item = add_cst_char(str_tem[0] );
	entry.type   = TYPE_CONST_CHAR;
	pop_char();  /*  get out of this token  */
	strcpy(str_tem, "" );  /* clear the str_tem array for next call */
	pre_type = entry.type; /* 為判斷+ 和- 的意義做準(zhǔn)備 */
	return entry;
}	
/* 處理整形常量和實(shí)型常量 */
ENTRY deal_num  	 (void)
{	
	int i, n_tem;
	double d_tem;
	int b_dot   = FALSE;  /* 字串中有無.  */
	int b_e		= FALSE;  /* 字串中有無e 若既無.也無e則認(rèn)為是整型   */
	ENTRY entry = { TYPE_UNDEF, NULL };
	for(i=0; (is_digit() || *p_char == '.' || *p_char == 'e') ; i++ )
	{/* 如果屬于整型和實(shí)型的要求的字符 則進(jìn)行處理 */
		if( *p_char == '.' )  
			b_dot += TRUE;
		if( *p_char == 'e' )
		{
			b_e   += TRUE;
			if( *(p_char+1) == '-' || *(p_char+1) == '+' )
			{
				str_tem[i++] = *p_char;
				str_tem[i]	 = *(p_char+1);
				p_char += 2;
				continue;
			}
		}
		str_tem[i] = *p_char;
		pop_char();
	}
	str_tem[i] = '\0';	

	if( b_dot == FALSE && b_e == FALSE )	/* 整型 */
	{
		n_tem = strtol (str_tem, NULL, 10 );
		if( pre_type == TYPE_NEGTIVE )
			n_tem = 0 - n_tem;
		entry.p_item = add_cst_num (n_tem );
		entry.type   = TYPE_CONST_NUM;
	}
	else if( b_dot > 1 || b_e >1  )
	{	/*  錯(cuò)誤 包含非法輸入e.g.  0.45...435ee543+33 要進(jìn)行處理  */
		/*  為了不影響以后的語法分析 向常量表中填入一項(xiàng) */
		d_tem = atof(str_tem );
		entry.p_item = add_cst_real (d_tem );
		entry.type   = TYPE_CONST_REAL;
		/*  need error handing... */
		report_error(ERROR_ILLEGAL_REAL, line, NULL );
	}
	else									/* 實(shí)型 */
	{	/*   */
		d_tem = atof(str_tem );
		if( pre_type == TYPE_NEGTIVE )
			d_tem = 0 - d_tem;
		entry.p_item = add_cst_real(d_tem );
		entry.type   = TYPE_CONST_REAL;
	}
	strcpy(str_tem, "" );  /* clear the str_tem array for next call */
	pre_type = entry.type; /* 為判斷+ 和- 的意義做準(zhǔn)備 */
	return entry;
}
/* 處理以字母開始的字串 包括保留字和標(biāo)識(shí)符 */
ENTRY deal_other	 (void) 	/* reservers and identifiers */
{
	int i;
	ENTRY entry = { TYPE_UNDEF, NULL };
	for(i=0; is_digit() || is_letter(); i++ )
	{
		str_tem[i] = *p_char;
		pop_char();
	}
	str_tem[i] = '\0';
	entry = query_reserve_table(str_tem );
	if( entry.type == TYPE_UNDEF )
	{
		entry.p_item = add_identifier(str_tem );
		entry.type   = TYPE_IDENTIFIER;
	}
	strcpy(str_tem, "" );  /* clear the str_tem array for next call */
	pre_type = entry.type; /* 為判斷+ 和- 的意義做準(zhǔn)備 */
	return entry;
}
/***********************************************************************/
/* 獲得一個(gè)Token的屬性 當(dāng)前字符指針后移 為取下一token做準(zhǔn)備 */
ENTRY get_token(void )
{
	ENTRY entry = { TYPE_UNDEF, NULL };
	/* goto token */
	if( !goto_token() )			/* 如果到達(dá)文件結(jié)尾符 掃描應(yīng)結(jié)束 */
		return entry;

	if( is_specifier() )		/* 界符和運(yùn)算符 */
	{
		if( ( *p_char == '+' || *p_char == '-' ) 
			&& ( *(p_char+1) >= 48 && *(p_char+1) <= 57 )
			&& ( pre_type != TYPE_IDENTIFIER )
			&& ( pre_type != TYPE_CONST_NUM  )
			&& ( pre_type != TYPE_CONST_REAL )
			&& ( pre_type != TYPE_CONST_CHAR ) )
		{/* 當(dāng)前符為+或- 且下一字符為數(shù)字,并且前一個(gè)Token類型不是標(biāo)識(shí)符和常量 */
		 /* 那么當(dāng)前符號(hào)是用來表示正負(fù)而不是加減的                             */
			pre_type = *p_char == '+' ? TYPE_POSITIVE : TYPE_NEGTIVE;
			pop_char();
			return deal_num();
		}
		return deal_specifier();
	}
	else if( *p_char == '\"' )	/* 字符串常量 */
	{
		return deal_double_();
	}
	else if( *p_char == '\'' )	/* 字符常量 */
	{
		return deal_single_();
	}	
	else if( is_digit() )		/*  整形常量 以后應(yīng)加入實(shí)型常量處理  */
	{
		return deal_num();
	}	
	else if( is_letter() )		/*  保留字或者標(biāo)識(shí)符 */
	{
		return deal_other();
	}
	else						/*	未知類型 應(yīng)報(bào)錯(cuò)   */
	{
		report_error(ERROR_UNKNOWN_CHAR, line, p_char );
		pop_char();
		return entry;
	}
}
/**********************************end of file*************************************/		
		


  

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲图片小说| 成人在线一区二区三区| 26uuu色噜噜精品一区二区| 国精品**一区二区三区在线蜜桃| 国产午夜精品福利| 日本高清不卡一区| 黄页视频在线91| 亚洲欧美视频一区| 国产调教视频一区| 日韩午夜激情av| 欧美亚日韩国产aⅴ精品中极品| 国产成人精品综合在线观看| 亚洲成人免费看| 亚洲人成在线播放网站岛国| 久久久久久一二三区| 欧美日韩国产高清一区二区三区 | 欧美xxxxx裸体时装秀| 91色乱码一区二区三区| 国产一区二区主播在线| 日韩av网站免费在线| 亚洲精品成人天堂一二三| 中文字幕va一区二区三区| 精品国产1区二区| 日韩美女主播在线视频一区二区三区 | 精品在线免费视频| 亚洲国产成人av| 亚洲精选免费视频| 中文字幕亚洲区| 国产精品美女久久福利网站| 久久久综合视频| 日韩欧美中文字幕一区| 正在播放亚洲一区| 欧美精品国产精品| 欧美理论电影在线| 欧美日本在线播放| 日韩一区二区三区在线视频| 欧美日韩精品系列| 欧美剧情片在线观看| 欧美三级一区二区| 欧美人妖巨大在线| 在线不卡中文字幕| 欧美精品久久99久久在免费线| 欧美狂野另类xxxxoooo| 91精品国产麻豆国产自产在线 | 欧美一区二区三区四区在线观看| 欧美色综合天天久久综合精品| 欧美中文字幕亚洲一区二区va在线| 99国产精品久久久久久久久久| 国产91清纯白嫩初高中在线观看| 国产91露脸合集magnet| 成人高清伦理免费影院在线观看| 成人av电影在线| 一本久久a久久精品亚洲| 在线观看精品一区| 欧美日韩黄视频| 日韩欧美视频在线| 国产日韩欧美综合一区| 国产精品白丝在线| 亚洲国产欧美日韩另类综合| 奇米影视在线99精品| 欧美日韩国产123区| 91精品国产欧美日韩| 久久久久99精品国产片| 国产精品你懂的| 一区二区三区欧美| 日本成人中文字幕在线视频| 狠狠狠色丁香婷婷综合久久五月| 国产成人av电影在线观看| 成人国产电影网| 欧美三级电影一区| 亚洲精品在线三区| 中文字幕一区二区三区蜜月| 亚洲1区2区3区4区| 国产精品一区2区| 一本高清dvd不卡在线观看 | 欧美一区二区三区免费大片| 精品久久久久久最新网址| 国产精品美女久久久久久久久| 亚洲另类春色校园小说| 久久99九九99精品| 91网站视频在线观看| 欧美一级黄色录像| 国产精品国产三级国产aⅴ原创| 亚洲国产综合色| 国产福利精品一区二区| 欧美日韩在线亚洲一区蜜芽| 久久久久久久久蜜桃| 亚洲一区视频在线观看视频| 狠狠狠色丁香婷婷综合久久五月| 91性感美女视频| 久久亚洲免费视频| 亚洲成人精品影院| va亚洲va日韩不卡在线观看| 日韩一级高清毛片| 亚洲黄色片在线观看| 激情文学综合插| 欧美日韩视频一区二区| 国产精品久久久99| 国内外成人在线视频| 欧美又粗又大又爽| 国产欧美日韩亚州综合| 日本aⅴ免费视频一区二区三区| 97久久久精品综合88久久| 久久婷婷一区二区三区| 视频一区视频二区中文| 91国模大尺度私拍在线视频| 国产日韩成人精品| 狠狠色狠狠色综合系列| 538在线一区二区精品国产| 亚洲丝袜美腿综合| 成人综合婷婷国产精品久久蜜臀 | 欧美天堂一区二区三区| 欧美国产97人人爽人人喊| 美女视频黄久久| 欧美午夜电影网| 亚洲欧洲三级电影| 国产成人综合自拍| www久久精品| 七七婷婷婷婷精品国产| 欧美日韩黄色影视| 亚洲高清免费一级二级三级| 91蜜桃婷婷狠狠久久综合9色| 国产偷国产偷精品高清尤物| 精品一区二区三区香蕉蜜桃| 日韩一级二级三级| 五月天久久比比资源色| 欧美少妇性性性| 亚洲成在人线免费| 欧美视频一区二区三区在线观看| 亚洲免费色视频| 一本久久综合亚洲鲁鲁五月天| 中文字幕在线播放不卡一区| 成人a级免费电影| 国产精品少妇自拍| 99久久精品国产一区二区三区| 国产三级精品三级| 成人免费看黄yyy456| 国产免费成人在线视频| 国产成人高清在线| 国产精品三级电影| 99re成人在线| 一区二区三区小说| 欧美精品亚洲二区| 日本aⅴ免费视频一区二区三区| 日韩一区二区在线观看视频播放| 日本在线不卡一区| 精品国产乱码久久| 国产一区二区剧情av在线| 国产欧美一区二区三区在线看蜜臀| 国产麻豆欧美日韩一区| 国产女人水真多18毛片18精品视频| 国产成人鲁色资源国产91色综| 国产精品久久久久aaaa| 色菇凉天天综合网| 肉肉av福利一精品导航| 精品国产区一区| 国产iv一区二区三区| 自拍偷拍亚洲激情| 欧美日韩国产高清一区| 狠狠色丁香久久婷婷综合丁香| 日本一区二区三区dvd视频在线| 成人激情免费视频| 亚洲国产综合在线| 精品国产乱码久久久久久夜甘婷婷 | 欧美一级片免费看| 国产精品小仙女| 亚洲欧美另类小说视频| 777午夜精品免费视频| 国产美女精品在线| 一区二区三区日韩欧美精品| 欧美一区二区黄色| 成人污视频在线观看| 亚洲欧美日韩国产另类专区| 在线播放日韩导航| 国产超碰在线一区| 亚洲成精国产精品女| 久久日韩精品一区二区五区| 99re热视频精品| 麻豆成人在线观看| ㊣最新国产の精品bt伙计久久| 欧美精品v日韩精品v韩国精品v| 精品中文av资源站在线观看| 亚洲欧美在线aaa| 日韩一级大片在线观看| 99视频国产精品| 青青草成人在线观看| 亚洲日本va午夜在线电影| 欧美α欧美αv大片| 91久久奴性调教| 国产乱子伦视频一区二区三区| 亚洲第一主播视频| 国产精品久久福利| 欧美mv和日韩mv国产网站| 在线亚洲一区观看| 国产成人av福利| 麻豆成人91精品二区三区| 一区二区三区在线免费观看| 欧美精彩视频一区二区三区| 欧美一级夜夜爽| 欧美亚洲尤物久久|