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

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

?? scan.cpp

?? 編譯器模擬程序
?? CPP
字號:
#include "scan.h"

/* source line number for listing */
int lineno; 
/* states in scanner DFA */
typedef enum
{ START,INASSIGN,INNOTASSIGN,INLEQ,INBEQ,INCOMMENT,INNUM,INID,DONE }
StateType;

static char lineBuf[BUFLEN]; /* holds the current line */
static int linepos = 0; /* current position in LineBuf */
static int bufsize = 0; /* current size of buffer string */
static int EOF_flag = false; /* corrects ungetNextChar behavior on EOF */

tokenForUse::tokenForUse(TokenType t,char c){

	type = t;
	memcpy(tokenValue, &c, 1);
	tokenValue[1] = '\0';
}
treenode::treenode(){

	this->leftChild = NULL;
	this->rightChild = NULL;
}
treenode::treenode(tokenForUse &t){

	this->content = t;
	this->leftChild = NULL;
	this->rightChild = NULL;
}
/* getNextChar fetches the next non-blank character
from lineBuf, reading in a new line if lineBuf is exhausted */
int compiler::getNextChar(void){ 
	
	if (!(linepos < bufsize)){ 
		
		lineno++;
		//fgets函數的功能是從指定的文件中讀一個字符串到字符數組中,函數調用的形式為: 
		//fgets(字符數組名,n,文件指針);在讀入的最后一個字符后加上串結束標志'\0'。  
		if (fgets(lineBuf,BUFLEN-1,source))
			// fprintf(文件指針,格式字符串,輸出表列)
			//將輸出表列中的內容存入文件指針指向的文件
		{ 
			bufsize = strlen(lineBuf);
			linepos = 0;
			return lineBuf[linepos++];
		}
		else
		{ 
			
			EOF_flag = true;
			return EOF;
		}
	}
	else return lineBuf[linepos++];
}

void compiler::printToken(TokenType ty, const char* str){
	
	switch(ty){
		
	case IF:
	case ELSE:
	case INT:
	case RETURN:
	case VOID:
	case WHILE:
		fprintf(listing, "reserved word:  %s\n", str);
		break;
	case ASSIGN : fprintf(listing, "=\n");
		break;
	case NOTASSIGN :fprintf(listing, "!=\n");
		break;
	case EQ :fprintf(listing, "==\n");
		break;
	case LT:fprintf(listing, "<\n");
		break;
	case BT :fprintf(listing, ">\n");
		break;
	case PLUS :fprintf(listing, "+\n");
		break;
	case MINUS : fprintf(listing, "-\n");
		break;
	case TIMES :fprintf(listing, "*\n");
		break;
	case OVER:fprintf(listing, "/\n");
		break;
	case LPAREN :fprintf(listing, "(\n");
		break;
	case RPAREN :fprintf(listing, ")\n");
		break;
	case LFK :fprintf(listing, "[\n");
		break;
	case RFK :fprintf(listing, "]\n");
		break;
	case LDK :fprintf(listing, "{\n");
		break;
	case RDK :fprintf(listing, "}\n");
		break;
	case SEMI :fprintf(listing, ";\n");
		break;
	case LEQ: fprintf(listing, "<=\n");
		break;
	case BEQ: fprintf(listing, ">=\n");
		break;
	case COMMA: fprintf(listing, ",\n");
		break;
	case ENDFILE: fprintf(listing, "EOF\n");
		break;
	case NUM: fprintf(listing, "NUM val = %s\n", str);
		break;
	case ID: fprintf(listing, "ID name = %s\n", str);
		break;
	case ERROR: fprintf(listing, "ERROR %s\n", str);
		break;
	default:
		fprintf(listing, "nuknown token %d\n", ty);
	}
}

/* ungetNextChar backtracks one character
in lineBuf 不消耗下一個字符*/
void compiler::ungetNextChar(void){
	if (!EOF_flag) 
		
		linepos-- ;
}

/* lookup an identifier to see if it is a reserved word */
/* uses linear search */
TokenType compiler::reservedLookup (char * s){ 
	
	int i;
	for (i=0;i<MAXRESERVED;i++)
		if (!strcmp(s,reservedWords[i].str))
			return reservedWords[i].tok;
		return ID;
}

tokenForUse compiler::getToken(void){  
	
	tokenForUse token = *(new tokenForUse());
	/* index for storing into tokenString */
	int tokenStringIndex = 0;
	
	/* holds current token to be returned */
	TokenType currentToken;
	
	/* current state - always begins at START 
	StateType類型包括:START,INASSIGN,INNOTASSIGN,INLEQ,INBEQ,INCOMMENT,INNUM,INID,DONE
	*/
	StateType state = START;
	
	/* flag to indicate save to tokenString */
	bool save;
	while (state != DONE){ 
		
		int c = getNextChar();
		save = true;
		
		switch (state){
			
		case START:
			if (isdigit(c))
				
				state = INNUM;
			else 
				if (isalpha(c))
					
					state = INID;
				else 
					if (c == '=')
						
						state = INASSIGN;
					else 
						if ((c == ' ') || (c == '\t') || (c == '\n'))
							
							save = false;
						else 
							if (c == '/' && getNextChar() == '*'){ 
								
								save = false;
								state = INCOMMENT;
							}
							else if (c == '!')
								
								state = INNOTASSIGN;
							else if(c == '<'){
								
								state = INLEQ;
							}
							else if(c == '>'){
								
								state = INBEQ;
							}
							else
							{ 
								state = DONE;
								switch (c){ 
								case EOF:
									save = false;
									currentToken = ENDFILE;
									break;
								case '+':
									currentToken = PLUS;
									break;
								case '-':
									currentToken = MINUS;
									break;
								case '*':
									currentToken = TIMES;
									break;
								case '/':
									currentToken = OVER;
									break;
								case '(':
									currentToken = LPAREN;
									break;
								case ')':
									currentToken = RPAREN;
									break;
								case '[':
									currentToken = LFK;
									break;
								case ']':
									currentToken = RFK;
									break;
								case '{':
									currentToken = LDK;
									break;
								case '}':
									currentToken = RDK;
									break;
								case ';':
									currentToken = SEMI;
									break;
								case ',':
									currentToken = COMMA;
									break;
								default:
									//由于當前狀態被置為接受狀態,出錯處理只需將currentToken = ERROR;
									currentToken = ERROR;
									break;
								}
							}
							break;
		case INCOMMENT:
			save = false;
			if (c == EOF){ 
				
				state = DONE;
				currentToken = ENDFILE;
			}
			else if (c == '*' && getNextChar() == '/'){
				
				state = START;
			}
			break;
			
		case INASSIGN:
			if(c == '='){
				
				state = DONE;
				currentToken = EQ;
			}
			else{
				
				state = DONE;
				currentToken = ASSIGN;
			}
			break;
			
		case INNOTASSIGN:
			if(c == '='){
				
				state = DONE;
				currentToken = NOTASSIGN;
			}
			else
			{ /* backup in the input 
			  不消耗當前輸入的字符,并將currentToken = ERROR;
				*/
				ungetNextChar();
				save = false;
				currentToken = ERROR;
			}
			break;
		case INNUM:
			if (!isdigit(c))
			{ /* backup in the input在緩沖區中回退一個字符 */
				ungetNextChar();
				save = false;
				state = DONE;
				currentToken = NUM;
			}
			break;
		case INID:
			if (!isalpha(c))
			{ /* backup in the input在緩沖區中回退一個字符 */
				ungetNextChar();
				save = false;
				state = DONE;
				currentToken = ID;
			}
			break;
		case INLEQ:
			
			if(c == '='){
				
				state = DONE;
				currentToken = LEQ;
			}
			else{
				
				ungetNextChar();
				save = false;
				state = DONE;
				currentToken = LT;
			}
			break;
		case INBEQ:
			if(c == '='){
				
				state = DONE;
				currentToken = BEQ;
			}
			else{
				
				ungetNextChar();
				save = false;
				state = DONE;
				currentToken = BT;
			}
			break;
		case DONE:
		default: /* should never happen */
			fprintf(listing,"Scanner Bug: state= %d\n",state);
			state = DONE;
			currentToken = ERROR;
			break;
     }
	 
     if ((save) && (tokenStringIndex <= MAXTOKENLEN))
		 
		 tokenString[tokenStringIndex++] = (char) c;
	 
     if (state == DONE){ 
		 
		 tokenString[tokenStringIndex] = '\0';
		 TraceScan = true;
		 if (currentToken == ID)
			 
			 currentToken = reservedLookup(tokenString);
     }
   }
   //如果跟蹤詞法分析的結果則打印相應的信息
   if (TraceScan) {
	   
	   fprintf(listing,"\t%d: ",lineno);
	   
	   printToken(currentToken,tokenString);
	   
	   token.type = currentToken;
	   
	   memcpy(token.tokenValue,tokenString,MAXTOKENLEN+1);
	   return token;
   }
   return token;
} /* end getToken */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产激情一区二区三区| 国产在线不卡视频| 国产精品美女一区二区| 精品国产伦理网| 久久综合久色欧美综合狠狠| 精品成人在线观看| 国产精品素人一区二区| 国产精品免费视频网站| 国产精品久久久久久久久免费樱桃 | 久久99久久精品| 国产麻豆成人传媒免费观看| 粉嫩av一区二区三区在线播放 | 97精品国产露脸对白| 色综合激情五月| 欧美巨大另类极品videosbest| 欧美精品日日鲁夜夜添| 精品伦理精品一区| 国产欧美精品一区二区三区四区| 国产婷婷色一区二区三区在线| 日本一区二区综合亚洲| 亚洲一区二区四区蜜桃| 久久草av在线| 91麻豆免费观看| 日韩一区二区免费视频| 久久久久久**毛片大全| 亚洲免费毛片网站| 肉肉av福利一精品导航| 国产精品99精品久久免费| 日本高清免费不卡视频| 日韩免费看的电影| 亚洲裸体xxx| 蜜桃一区二区三区四区| 色综合咪咪久久| 精品成人免费观看| 亚洲成va人在线观看| 国产激情视频一区二区在线观看| 91啪在线观看| 欧美精品一区二区三区在线播放| 国产精品福利av| 激情综合色综合久久综合| 91美女片黄在线观看91美女| 精品福利在线导航| 亚洲成av人**亚洲成av**| 国产成人在线影院 | 国产成人在线网站| 在线成人高清不卡| 国产精品国产a级| 久久99国产精品免费网站| 色综合久久久久综合体| 久久久精品国产免费观看同学| 亚洲尤物在线视频观看| 成人免费视频一区二区| 26uuu国产在线精品一区二区| 亚洲一区二区免费视频| 91同城在线观看| 国产精品少妇自拍| 国产一区二三区| 日韩一级高清毛片| 五月激情综合网| 欧美日韩国产综合一区二区三区| 亚洲人精品午夜| 粉嫩aⅴ一区二区三区四区| 欧美成va人片在线观看| 香港成人在线视频| 欧美日韩视频专区在线播放| 亚洲精品欧美在线| 日本韩国欧美一区| 一区2区3区在线看| 欧洲生活片亚洲生活在线观看| 亚洲欧美综合另类在线卡通| gogo大胆日本视频一区| 中文字幕一区二区5566日韩| 丁香六月久久综合狠狠色| 国产丝袜美腿一区二区三区| 国产精品一区二区三区四区| 久久久久久久久久美女| 国产精品久久久久久久久快鸭| 午夜电影一区二区三区| 欧美日韩视频在线一区二区| 亚洲色图制服丝袜| 欧美性极品少妇| 亚洲国产三级在线| 7777精品伊人久久久大香线蕉最新版 | 日本韩国视频一区二区| 一区二区国产视频| 欧美欧美午夜aⅴ在线观看| 天天影视网天天综合色在线播放 | 麻豆久久一区二区| 日韩欧美一级片| 国产美女视频一区| 国产精品久久午夜夜伦鲁鲁| av不卡在线观看| 亚洲一区二区三区不卡国产欧美 | 国产视频视频一区| 91一区一区三区| 亚洲电影视频在线| 欧美xxxxxxxxx| av在线一区二区三区| 亚洲在线一区二区三区| 精品国产乱码久久久久久浪潮| 国产乱码精品一区二区三区忘忧草| 国产精品麻豆久久久| 在线观看一区二区视频| 青草国产精品久久久久久| 国产亚洲欧美一级| 在线观看国产精品网站| 九九热在线视频观看这里只有精品| 国产女人18毛片水真多成人如厕 | 成人深夜在线观看| 亚洲aaa精品| 国产精品久久看| 9191成人精品久久| 99精品视频在线观看| 蜜桃一区二区三区在线观看| 中文字幕亚洲综合久久菠萝蜜| 欧美精品粉嫩高潮一区二区| 成人黄色av电影| 精品一区二区三区的国产在线播放 | 一区二区三区在线视频免费| 日韩三级精品电影久久久| www..com久久爱| 国产麻豆成人精品| 日本午夜一区二区| 亚洲永久精品大片| 成人欧美一区二区三区黑人麻豆 | 欧美日韩激情在线| 99久久精品免费看| 国产成人免费xxxxxxxx| 免费在线看一区| 亚洲成人中文在线| 亚洲欧洲精品一区二区三区不卡| 日韩免费视频一区二区| 欧美日韩精品电影| 91国偷自产一区二区三区成为亚洲经典| 国产一区二区三区精品欧美日韩一区二区三区 | 国产欧美日本一区二区三区| 欧美一区二区三区啪啪| 欧洲人成人精品| 在线影视一区二区三区| 成人白浆超碰人人人人| 国产91富婆露脸刺激对白| 国产一区二区三区av电影 | 欧美日韩一卡二卡| 在线视频一区二区免费| 色老汉av一区二区三区| 一本色道亚洲精品aⅴ| 成人av网站在线观看免费| 国产成人免费视频一区| 国产精品自在欧美一区| 国产一区二区三区蝌蚪| 久久er精品视频| 国产精品一二三区| 国产成人免费视频精品含羞草妖精| 国产一本一道久久香蕉| 丁香婷婷深情五月亚洲| 成人午夜又粗又硬又大| 波多野结衣亚洲一区| av中文字幕不卡| 日本高清不卡在线观看| 欧美日韩你懂得| 日韩欧美亚洲一区二区| 欧美精品一区二区三区一线天视频| 日韩欧美高清一区| 久久久国产精品麻豆| 亚洲国产电影在线观看| 成人欧美一区二区三区1314| 依依成人综合视频| 日韩av不卡一区二区| 国产剧情一区在线| 91色.com| 日韩欧美一二区| 国产亚洲综合性久久久影院| 国产精品久久看| 午夜视黄欧洲亚洲| 国产裸体歌舞团一区二区| 91女神在线视频| 欧美精选一区二区| 国产欧美一二三区| 亚洲国产精品一区二区www在线| 奇米色一区二区三区四区| 成人黄色综合网站| 欧美群妇大交群中文字幕| 久久久99久久| 亚洲无线码一区二区三区| 经典三级在线一区| 欧美一a一片一级一片| 久久婷婷国产综合精品青草| 亚洲图片另类小说| 久久精品国产99国产| 99久久精品国产毛片| 日韩欧美激情四射| 一区二区成人在线| 国产美女娇喘av呻吟久久| 在线观看日韩国产| 国产欧美一区二区精品秋霞影院| 婷婷开心激情综合| 色综合久久天天| 国产精品美女久久久久久| 日韩精品五月天| 欧美在线观看视频一区二区三区|