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

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

?? scanner.cpp

?? C-MINUS編譯器
?? CPP
字號:
/**:	scanner.cpp	implementation file
&
*		author:	lonelyforest;
*		data:	2006.03.16
*/

#include "scanner.h"
#include <cstdio>


// overload operator =
Token &Token::operator =(const Token &rh)
{
	type = rh.type;
	str = rh.str;

	return *this;
}

/**: construction & destruction
&
*		author:	lonelyforest;
*		data:	2006.03.16
*/
//-----------------------------------------------------------------------------
Scanner::Scanner(const string &filename):Tokenizer(filename)
{
	m_pushed = false;
	m_token.type = k_NONE;
	build_key_map(); // initial key words map
}
// .........
Scanner::~Scanner()
{

}

// push current token
//-----------------------------------------------------------------------------
void  Scanner::push()
{
	m_pushed = true;
}

//  initial keyword map
void Scanner::build_key_map()
{
	string minic_keywords[] ={"int", "else", 
		"return", "void", "if","while",	"read", "write"};
	for (int i = 0; i < 8; ++i)
	{
		Token temp;
		temp.type = tokenType(i);
		temp.str = minic_keywords[i];
		key_word.push_back( temp);
	}
}

/**: getListFile
&	
*	create the trace log file...
&
*	author: lonelyforest
*	data:	2006.03.16
*/
//-----------------------------------------------------------------------------
bool Scanner::getListFile()
{
	if (TraceSource)
	{
	int pos = source_name.rfind('.');
	string listfile(source_name);
	listfile.erase(pos, listfile.size()-1);
	listfile += ".log";

	ofstream listing(listfile.c_str(), ofstream::out);

	if (!listing )
	{
		sprintf(msg_temp, "create source list file \"%s\" fail...",listfile.c_str());
		outputMsg(-1,msg_temp );

		return false;
	}
	else
	{	
		for (std::vector< string >::iterator iter = list_msg_.begin();
			iter != list_msg_.end();
			++iter)
		{
			listing << *iter;			
		}

		listing <<"\n---------------------------- Done. ----------------------------\n";
		listing << " There has " << errCount()<< " error(s) and "
			<< warnCount() << " warning(s)\n";
			
		sprintf(msg_temp, "source list file has save to \"%s\"...",listfile.c_str());
        outputMsg(-2, msg_temp);    // -2 means source file list.
	}

	return true;
	}
	else	
	{
		return false;
	}
}


//	look_up
// if found return the tokenType value,
// else	return k_NONE;
//-----------------------------------------------------------------------------
tokenType	Scanner::reservedLookup(const string& word)
{	// can use binary-search...maybe better
	tokenType rev = k_ID;

	for( std::vector<Token>::size_type i = 0;	
		i < key_word.size();
        ++i)
	{
		if ( key_word[i].str == word )
		{
			rev = key_word[i].type;
			break;
		}
	}

	return rev;
}



/*: s_state;
&
*   狀態機的各個狀態,nextToken() 的輔助
*   狀態。
*/
enum    stateType {
	s_START, s_INID, s_INNUM, s_INCOMMENT,
	s_INASSIGN, s_INL, s_ING, s_DONE};

//-------------------------------------------------------------------------------

/**: nextToken
&
*	primary interface ......
*	return a Token from source file(list_of_source)
&
*	author: lonelyforest
*	data:	2006.03.16
*/
//-----------------------------------------------------------------------------
Token& Scanner::nextToken()
{
	if (m_pushed )
	{
		m_pushed = false;
		return m_token;
	}
	else
	{

		char t;
		bool   save = false;
		int	tokenStringIndex;
		tokenStringIndex = 0;

		stateType  state = s_START;
		m_token.str = "";
		m_token.type = k_NONE;

		while (state != s_DONE)
		{
			char c;
			c = getNextChar();
			save = false;
			switch (state)
			{
			case s_START:
				if (::isdigit(c)){
					save= true;
					state = s_INNUM;
				}
				else if (::isalpha(c)|| c == '_'){
					save = true;
					state = s_INID;
				}
				else if (c=='=')
					state = s_INASSIGN;
				else if ( ::isspace(c))//(c== ' ') || (c=='\t') || (c=='\n'))
					state = s_START;	/* blanks */
				else if (c== '<')
					state = s_INL;
				else if (c== '>')
					state = s_ING;
				else
				{
					state = s_DONE;
					switch (c)
					{
					case EOF:
						m_token.type = k_EOF;
						m_token.str  = "EOF";
						break;
					case '+':
						m_token.type = PLUS;
						m_token.str  = "+";
						break;
					case '-':
						m_token.type = MINUS;
						m_token.str  = "-";
						break;
					case '*':
						m_token.type = TIMES;
						m_token.str  = "*";
						break;
					case '%':
						m_token.type = MOD;
						m_token.str = "%";
						break;
					case '(':
						m_token.type = LPARAN;
						m_token.str  = "(";
						break;
					case ')':
						m_token.type = RPARAN;
						m_token.str  = ")";
						break;
					case '{':
						m_token.type = LBRACE;
						m_token.str  = "{";
						break;
					case '}':
						m_token.type = RBRACE;
						m_token.str  = "}";
						break;
					case ',':
						m_token.type = COMMA;
						m_token.str  = ",";
						break;
					case ';':
						m_token.type = SEMI;
						m_token.str  = ";";
						break;
					case '[':
						m_token.type = LSQUARE;
						m_token.str  = "[";
						break;
					case ']':
						m_token.type = RSQUARE;
						m_token.str  = "]";
						break;
					case '/':	/* 判斷是否有注釋 */
						t = getNextChar();
						if ( t == '*')		//C Style Comment,
						{
							state = s_INCOMMENT;
						}
						else if ( t == '/')	// C++ Style Comment,
						{
							c = t;
							while (c != '\n' && c != EOF)
							{
								c = getNextChar();
							}
								state = s_START;
						}
						else
						{		/* not comment, */
							m_token.type = DIV;
							m_token.str = "/";
							unGetNextChar();
						}
							break; // break case '/':
						case '!':
						t = getNextChar();
						if ( t== '=' ) {
							m_token.type = NEQ;
							m_token.str = "!=";
						}
						else
						{
							m_token.type = k_ERROR;
							m_token.str = "!";
							unGetNextChar();
						}

						break;

					default:
						add_err();
						m_token.type = k_ERROR;
						m_token.str = c;
						break;
					}           // end inside switch
				}

				break; // end case s_START

			case s_INCOMMENT:
				save = false;
				t = getNextChar();
				if ( (c!=EOF) && (t!=EOF))
				{	/* 防止出現文件結束但是注釋尚未結束的情況 */
					if ((c == '*') && (t=='/'))
					{	// C Style Comment,
						state = s_START;
					}
					else
					{
						unGetNextChar();
					}
				}
				else
				{ /* 出現文件結束但是注釋尚未結束 */
					outputMsg(-1,"maybe comment end before code !");
					add_err();
					m_token.type = k_NONE;
					m_token.str = "--> comment unexpected end before code !";
					state = s_DONE;
				}
				break;  // end  state s_INCOMMENT
			case s_INASSIGN:
				state = s_DONE;
				m_token.type = ASSIGN;
				m_token.str = "=";
				if (c== '=')
				{
					m_token.type = EQ;
					m_token.str = "==";
				}
				else {	unGetNextChar();}
				break;
			case s_INL:  /* < or <= */
				state = s_DONE;
				m_token.type = LT;
				m_token.str = "<";
				if (c=='=')
				{
					m_token.type = NGT;
					m_token.str = "<=";
				}
				else { unGetNextChar();}
				break;
			case s_ING:  /* > or >= */
				state = s_DONE;
				m_token.type = GT;
				m_token.str = ">";
				if (c=='=')
					m_token.type = NLT;    /* >= */
				else { unGetNextChar();}
				break;
			case s_INNUM: /* number, integer */
				save = true;
				if (!::isdigit(c))
				{ /* backup int the input */
					unGetNextChar();
					save = false;
					state = s_DONE;
					m_token.type = k_NUM;
				}
				break;
			case s_INID:
				save = true;
				if( !( ::isalpha(c) || ::isdigit(c) || c == '_'))
				{ /*backup in the input */
					unGetNextChar();
					save = false;
					state = s_DONE;
					m_token.type = k_ID;
				}
				break;
			case s_DONE:	/* 除非機器或者系統故障,否則不會出現 */
			default:    /* should never happen */
				sprintf(msg_temp, "Scanner Bug : State = %4d", state);
				outputMsg(lineno(),msg_temp);
				add_err();
				m_token.type = k_ERROR;
				m_token.str = msg_temp;

				state = s_DONE;
				break;
			}

			if (save && (tokenStringIndex < 43))
			{
				//tokenString[tokenStringIndex++] = c;
				tokenStringIndex++;
				m_token.str += c;
			}

			if (state == s_DONE)
			{
				//tokenString[tokenStringIndex] = '\0';
				if (m_token.type == k_ID)
				{
					m_token.type = reservedLookup(m_token.str);
				}
			}
		}


		// trace compiler and trace scan
		if (m_token.type == k_ERROR)
		{
			string msg = "unknow or unsuported symbol ----> \'";
			msg += m_token.str+"\'";
			outputMsg(lineno(), msg.c_str());
			if (TraceSource )
			{
				sprintf(msg_temp, "\t%d: Error: unexpected or unsuported symbol--> '%s'\n", lineno(), m_token.str.c_str());
				insert_list(msg_temp);
			}
		}
		else if (TraceSource && (m_token.type != k_EOF) )
		{
			// 排版也很有藝術哦,
			string outmsg;
			sprintf(msg_temp, "\t%d: ", lineno());
			outmsg = msg_temp;
			switch (m_token.type)
			{
			case k_ID:
				outmsg += "ID, name = ";
				break;
			case k_NUM:
				outmsg += "NUM, val = ";
				break;
			case k_ELSE:	case k_IF:
			case k_WHILE:	case k_READ:
			case k_WRITE:	case k_INT:
			case k_RETURN:	case k_VOID:
				outmsg += "reserve word: ";
				break;
			case k_ERROR:
				outmsg += m_token.str;
				outmsg += ", Scanner Bug !";
			case k_NONE:
				outmsg += "Bug!";
				break;
			default:
				break;
			}
			
			outmsg = outmsg + m_token.str + '\n';
			Tokenizer::insert_list(outmsg.c_str());
		}
		
		return m_token;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区国产视频| 日本免费在线视频不卡一不卡二| 欧美三级一区二区| 国产最新精品精品你懂的| 亚洲人成网站色在线观看| 欧美大片一区二区三区| 在线视频观看一区| 国产精品中文有码| 免费观看一级欧美片| 一区二区三区在线观看视频| 国产三级欧美三级日产三级99| 91精品免费在线观看| 色婷婷综合五月| 成人av在线网站| 国产在线精品免费av| 日韩在线一二三区| 亚洲激情综合网| 亚洲视频一区二区在线观看| 欧美激情一区在线| xf在线a精品一区二区视频网站| 欧美日韩专区在线| 在线观看成人小视频| 91在线观看一区二区| 成人开心网精品视频| 国产在线播精品第三| 精品一区二区三区免费视频| 日本不卡在线视频| 婷婷亚洲久悠悠色悠在线播放| 亚洲免费观看在线视频| 国产精品久久久久久久裸模| 国产精品欧美极品| 国产精品三级av| 欧美国产综合色视频| 欧美国产精品一区二区三区| 久久精品男人的天堂| 久久先锋资源网| 久久天天做天天爱综合色| 精品国产在天天线2019| 欧美精品一区二区三区久久久| 日韩欧美在线123| 日韩无一区二区| 日韩欧美国产高清| 欧美xxx久久| 国产亚洲欧洲997久久综合| 26uuu成人网一区二区三区| 久久精品欧美日韩精品| 中文一区一区三区高中清不卡| 国产欧美精品一区二区三区四区| 国产日韩欧美综合一区| 国产精品五月天| 亚洲天堂a在线| 艳妇臀荡乳欲伦亚洲一区| 亚洲综合激情网| 免费精品视频在线| 国产精品亚洲人在线观看| 成人黄色免费短视频| 99久久婷婷国产综合精品| 日本韩国精品一区二区在线观看| 欧美亚洲综合另类| 欧美精品vⅰdeose4hd| 久久综合狠狠综合久久综合88 | 韩国av一区二区三区| 极品少妇xxxx偷拍精品少妇| 国产98色在线|日韩| 色婷婷亚洲综合| 91精品国产品国语在线不卡| 国产亚洲精品久| 亚洲精品国产精华液| 日韩精品电影一区亚洲| 国产精品自拍三区| 色吊一区二区三区| 日韩免费一区二区三区在线播放| 欧美国产丝袜视频| 亚洲电影一级片| 国产一区二区精品久久91| 99精品欧美一区| 欧美一区二区三区的| 国产精品免费丝袜| 亚洲va国产va欧美va观看| 国产裸体歌舞团一区二区| 91丨九色丨黑人外教| 日韩欧美高清在线| 亚洲另类一区二区| 国产在线视频不卡二| 日本韩国欧美一区二区三区| 久久人人爽人人爽| 亚洲尤物视频在线| 国产成人夜色高潮福利影视| 欧美精品久久久久久久久老牛影院| 久久女同精品一区二区| 亚洲成人激情综合网| 国产91精品在线观看| 91麻豆精品国产91久久久| 18成人在线观看| 国产美女一区二区| 3d成人动漫网站| 成人免费视频在线观看| 狠狠色丁香久久婷婷综合_中 | 美女视频免费一区| 93久久精品日日躁夜夜躁欧美| 日韩欧美中文字幕公布| 亚洲精品综合在线| 国产精品中文字幕一区二区三区| 9191国产精品| 亚洲综合在线电影| 99精品久久免费看蜜臀剧情介绍| 欧美tickling网站挠脚心| 亚洲国产精品一区二区久久| 99久久伊人网影院| 国产欧美精品一区| 国模无码大尺度一区二区三区| 欧美日韩亚洲综合在线| 日韩美女啊v在线免费观看| 韩日av一区二区| 日韩免费观看高清完整版在线观看| 亚洲免费在线观看| av在线一区二区| 中文字幕+乱码+中文字幕一区| 国产一区在线观看视频| 日韩欧美一区二区视频| 日韩va亚洲va欧美va久久| 欧美日韩国产一二三| 夜夜嗨av一区二区三区| 色综合久久天天| 成人免费在线视频观看| 99国产精品视频免费观看| 国产精品久久久久国产精品日日| 国产精一品亚洲二区在线视频| 精品sm捆绑视频| 激情久久久久久久久久久久久久久久| 欧美精品乱码久久久久久| 天天综合网 天天综合色| 欧美三级电影网站| 图片区小说区国产精品视频| 欧美日韩久久久| 午夜精品福利视频网站| 欧美一区二区三区四区高清| 日韩一区精品字幕| 日韩午夜小视频| 国内精品在线播放| 日本一区二区三区电影| 国产91丝袜在线播放九色| 欧美国产97人人爽人人喊| av资源站一区| 一区二区三区影院| 欧美日韩国产综合视频在线观看| 日韩精品视频网站| 欧美白人最猛性xxxxx69交| 国内国产精品久久| 国产精品久久久久一区二区三区 | 日韩在线一区二区三区| 日韩一区二区免费在线电影| 精品一区二区在线播放| 国产亚洲欧洲997久久综合| 成人免费视频caoporn| 亚洲欧洲三级电影| 欧美网站一区二区| 久久精品国产77777蜜臀| 国产亚洲短视频| 色综合视频一区二区三区高清| 亚洲成人一二三| 2欧美一区二区三区在线观看视频| 成人综合婷婷国产精品久久| 国产精品人人做人人爽人人添| 色爱区综合激月婷婷| 日韩成人精品在线| 国产精品色哟哟网站| 欧美色图天堂网| 狠狠色丁香婷婷综合| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 在线视频国产一区| 极品少妇一区二区| 一区二区视频免费在线观看| 欧美精品三级日韩久久| 高清不卡一二三区| 亚洲午夜羞羞片| 久久精品亚洲精品国产欧美kt∨| 91极品美女在线| 国产一区二区在线视频| 亚洲激情综合网| 久久久www成人免费毛片麻豆| 在线观看网站黄不卡| 国产一区二区三区蝌蚪| 一区二区三区波多野结衣在线观看| 91精品国产综合久久精品图片 | 国产免费久久精品| 5566中文字幕一区二区电影| 成人妖精视频yjsp地址| 日韩中文字幕不卡| 亚洲精品午夜久久久| 久久久亚洲精华液精华液精华液 | 国产欧美精品一区二区色综合| 欧美日韩日日骚| 97精品国产97久久久久久久久久久久 | 精久久久久久久久久久| 亚洲综合色区另类av| 中文一区二区在线观看| 欧美mv日韩mv国产| 欧美猛男男办公室激情| 99免费精品在线|