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

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

?? parser.cpp

?? 學生管理系統能夠幫助下載的朋友們很有用呢
?? CPP
字號:
/*************************************************** file: Parser.cpp* date: 2006-04-12* author: wuzuyang* describe: parser**************************************************///#define TRACE_DEBUG#ifdef TRACE_DEBUG	#define TRACE(FUNCTION) printf("%-16s token = %s\n", FUNCTION, currentToken.name);#else	#define TRACE(FUNCTION)#endif#include "Parser.h"#include <stdio.h>#include <stdlib.h>Parser::Parser(char* sourcefile){	lexer = new Lexer(sourcefile);}Parser::Parser(){}Parser::~Parser(){	delete lexer;}void Parser::setLexer(Lexer *srclexer){	lexer = srclexer;}Token Parser::nextToken(){	currentToken = lexer->nextToken();	return currentToken;}void Parser::reset(){	lexer->reset();}void Parser::printError(const char *error){	// private method	printf("%s when token = '%s'\n", error, currentToken.name);}void Parser::printError(){	// public method	if(lexer->isReady())		printf("\n*** ERROR BEFORE: ***\n%s", lexer->getSrc()+lexer->getIndex());	else		printf("Lexer is not ready!\n");}/*==================================================================*/SyntaxTree* Parser::parse(){	SyntaxTree* tree = NULL;	if(lexer->isReady()){		currentToken = lexer->nextToken();		tree = Statement();	}else{		printf("no ready\n");	}	return tree;}SyntaxTree* Parser::Statement(){	TRACE("in Statement();");		SyntaxTree *tree = NULL;		switch(currentToken.type){		case LEXER_DONE:			tree = new SyntaxTree(LEXER_DONE);			break;		case ID:			this->nextToken();			tree = Assign();			if(tree != NULL){				tree->addLeft(ID);			}			break;		case WHILE:			this->nextToken();			tree = While();			break;		case BEGIN:			this->nextToken();			tree = Block();			if(currentToken.type != END){				tree =  NULL;				this->printError("ERROR! begin without end");			}			//this->nextToken();			this->currentToken.type = SEMI;			break;		case IF:			this->nextToken();			tree = Condition();			break;		default:			tree = NULL;			break;	}		TRACE("out Statement();");	return tree;}SyntaxTree* Parser::Assign(){	TRACE("in Assign();");		SyntaxTree *tree = NULL;	if(currentToken.type == ASSIGN){		this->nextToken();		SyntaxTree *temptree = Expression();				if(temptree != NULL){			tree = new SyntaxTree(ASSIGN);			tree->addRight(temptree);		}	}else{		this->printError("ERROR! Assignment statement expects '=';");		return NULL;	}		TRACE("out Assign();");	return tree;}SyntaxTree* Parser::Expression(){	TRACE("in Expression();");	SyntaxTree *temp = NULL;	SyntaxTree *tree = T();	if(tree == NULL){		return NULL;	}		while(currentToken.type == PLUS || currentToken.type == MINUS){		temp = new SyntaxTree(currentToken.type);		temp->addLeft(tree);		tree = temp;		this->nextToken();				temp = T();		if(temp != NULL){			tree->addRight(temp);		}else{			this->printError("ERROR! Behind '+';");			return NULL;		}	}		return tree;}SyntaxTree* Parser::T(){	SyntaxTree *temp = NULL;	SyntaxTree *tree = F();		if(tree == NULL){		return NULL;	}		while(currentToken.type == MUL || currentToken.type == DIV){		temp = new SyntaxTree(currentToken.type);		temp->addLeft(tree);		tree = temp;		this->nextToken();				temp = F();		if(temp != NULL){			tree->addRight(temp);		}else{			this->printError("ERROR in T();");			return NULL;		}	}		return tree;}SyntaxTree* Parser::F(){	SyntaxTree *tree = NULL;		if(currentToken.type == ID){		tree = new SyntaxTree(ID);	}else if(currentToken.type == NUM){		tree = new SyntaxTree(NUM, atoi(currentToken.name));	}else{		this->printError("ERROR! in F();");	}		this->nextToken();		return tree;}/*==================================================================*/SyntaxTree* Parser::Boolean(){	TRACE("in Boolean();");	SyntaxTree *temp = NULL;	SyntaxTree *tree = T2();	if(tree == NULL){		return NULL;	}		while(currentToken.type == OR){		temp = new SyntaxTree(OR);		temp->addLeft(tree);		tree = temp;		this->nextToken();				temp = T2();		if(temp != NULL){			tree->addRight(temp);		}else{			this->printError("ERROR! behind OR;");			return NULL;		}	}		TRACE("out Boolean();");	return tree;}SyntaxTree* Parser::T2(){	SyntaxTree *temp = NULL;	SyntaxTree *tree = F2();	if(tree == NULL){		return NULL;	}		while(currentToken.type == AND){		temp = new SyntaxTree(AND);		temp->addLeft(tree);		tree = temp;		this->nextToken();				temp = F2();		if(temp != NULL){			tree->addRight(temp);		}else{			this->printError("ERROR! behind AND;");			return NULL;		}	}		return tree;}SyntaxTree* Parser::F2(){	SyntaxTree *temp = NULL;	SyntaxTree *tree = Expression();		if(tree == NULL){		return NULL;	}		switch(currentToken.type){		case LT:			temp = new SyntaxTree(LT);			break;		case GT:			temp = new SyntaxTree(GT);			break;		case EQ:			temp = new SyntaxTree(EQ);			break;		default :			break;	}		if(temp != NULL){		this->nextToken();		temp->addLeft(tree);		tree = temp;		temp = Expression();		if(temp != NULL){			tree->addRight(temp);		}else{			this->printError("ERROR! Relation Operator needs Expression behind;");			return NULL;		}	}	return tree;}/*==================================================================*/SyntaxTree* Parser::While(){	TRACE("in While();");	SyntaxTree *tree = new SyntaxTree(WHILE);	SyntaxTree *temp = Boolean();		if(temp == NULL){		this->printError("ERROR! in While(); Condition NULL;");		return NULL;	}	tree->addLeft(temp);		if(currentToken.type != DO){		this->printError("ERROR! in While(); token.type!=DO;");		return NULL;	}	this->nextToken();	temp = Statement();	if(temp == NULL){		this->printError("ERROR! in While(); DO empty;");		return NULL;	}	tree->addRight(temp);		TRACE("out While();");	return tree;}/*==================================================================*/SyntaxTree* Parser::Begin(){	return Block();}/*	L = S(;S)* | <empsilon>*/SyntaxTree* Parser::Block(){	TRACE("in Block();");	SyntaxTree *tree = Statement();	SyntaxTree *temp = new SyntaxTree(BEGIN);		if(tree == NULL){		//this->printError("WARNNING! Don't accept empty block.");		return NULL;		/*		while(currentToken.type == SEMI){			this->nextToken();		}		return new SyntaxTree(BEGIN);		*/	}	temp->addLeft(tree);	tree = temp;	//	temp = L2();	while(currentToken.type == SEMI){		this->nextToken();	}	temp = Block();	if(temp != NULL){	// it couldn't be		if(temp->getLeft() != NULL)			tree->addRight(temp);	}		TRACE("out Block();");	if(tree == NULL)		return NULL;	if(tree->getRight() == NULL)		return tree->getLeft();	else		return tree;}/*==================================================================*/SyntaxTree* Parser::Condition(){	TRACE("in Condition();");		SyntaxTree *tree = new SyntaxTree(IF);	SyntaxTree *temp = Boolean();	SyntaxTree *temp2 = NULL;		if(temp == NULL){		this->printError("ERROR! if without a boolean statement.");		return NULL;	}	tree->addLeft(temp);		if(currentToken.type != THEN){		this->printError("ERROR! if without then.");		return NULL;	}	this->nextToken();	temp = Statement();		if(temp == NULL){		this->printError("ERROR! then without a statement.");		return NULL;	}		temp2 = new SyntaxTree(THEN);	temp2->addLeft(temp);		//temp2 = temp;		this->nextToken();	if(currentToken.type == ELSE){		TRACE("ELSE");		this->nextToken();		//temp = new SyntaxTree(BEGIN);		//temp->addLeft(temp2);		//temp2 = temp;				temp = Statement();		if(temp == NULL){			this->printError("ERROR! else without a statement.");			return NULL;		}		temp2->addRight(temp);	}		tree->addRight(temp2);		TRACE("out Condition();");	return tree;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久色在线观看| 欧美午夜精品理论片a级按摩| 亚洲精品日产精品乱码不卡| 久久这里只有精品首页| 欧美中文字幕一二三区视频| av中文字幕不卡| 国产精品456露脸| 久久国产综合精品| 日本va欧美va精品| 日本视频一区二区三区| 亚洲成人动漫在线观看| 亚洲在线视频网站| 一区二区三区**美女毛片| 亚洲欧洲另类国产综合| 国产精品欧美一区喷水| 国产日韩欧美不卡在线| 国产精品丝袜91| 国产精品久久久久久久久免费樱桃 | 久久婷婷综合激情| 久久久久国产精品麻豆ai换脸| 日韩欧美aaaaaa| 精品国产一区二区亚洲人成毛片| 日韩久久久久久| 久久夜色精品国产欧美乱极品| 精品久久久久一区二区国产| 日韩欧美一二区| 国产喂奶挤奶一区二区三区| 久久久精品tv| 亚洲日本在线天堂| 亚洲成a天堂v人片| 开心九九激情九九欧美日韩精美视频电影| 日本成人超碰在线观看| 久久疯狂做爰流白浆xx| 国产成a人亚洲| 色婷婷亚洲综合| 欧美久久久久久久久| 欧美一级高清大全免费观看| 欧美精品一区二区三区四区| 中文一区二区在线观看| 亚洲视频一区二区在线观看| 午夜精品aaa| 国产精品99久| 欧美午夜电影网| 2024国产精品| 一区二区久久久久久| 麻豆精品视频在线观看视频| 成人综合在线观看| 欧美日韩国产精品成人| 国产色综合一区| 亚洲综合精品久久| 国产一区高清在线| 色婷婷综合久久久久中文| 91精品国产免费| 国产精品日产欧美久久久久| 丝袜美腿亚洲一区二区图片| 亚洲午夜精品在线| 激情综合色综合久久综合| 成人中文字幕电影| 欧美精品久久天天躁| 久久色在线视频| 亚洲va国产va欧美va观看| 久久se精品一区精品二区| 91在线播放网址| 精品免费一区二区三区| 亚洲成在人线免费| 丰满放荡岳乱妇91ww| 欧美一区二区三区精品| 怡红院av一区二区三区| 国产不卡在线视频| 欧美一级午夜免费电影| 亚洲一区在线观看视频| 国产成人亚洲综合色影视| 欧美裸体bbwbbwbbw| 亚洲国产精品传媒在线观看| 美女在线观看视频一区二区| 欧美性大战久久久| 亚洲视频小说图片| 成人伦理片在线| 久久久久久麻豆| 国产呦萝稀缺另类资源| 欧美一二三区在线| 日本欧美大码aⅴ在线播放| 在线视频欧美区| 亚洲欧美日韩国产成人精品影院| 成人午夜碰碰视频| 欧美国产精品一区二区| 国产激情一区二区三区桃花岛亚洲| 日韩三级av在线播放| 日韩激情视频在线观看| 欧美日韩黄色影视| 午夜精品一区在线观看| 精品视频在线免费看| 亚洲制服丝袜av| 欧美无砖砖区免费| 午夜影院久久久| 91精品国产乱码久久蜜臀| 视频一区视频二区中文字幕| 欧美高清你懂得| 久久精品国产一区二区| 日韩三级中文字幕| 国产酒店精品激情| 国产情人综合久久777777| 成人激情免费网站| 亚洲欧美日本韩国| 欧美日韩亚洲高清一区二区| 亚洲国产欧美另类丝袜| 欧美久久久影院| 老司机精品视频线观看86| 精品久久免费看| 粉嫩在线一区二区三区视频| 国产精品乱码妇女bbbb| 丰满亚洲少妇av| 中文字幕在线免费不卡| 91蜜桃免费观看视频| 一区二区三区中文字幕精品精品 | 男女男精品视频网| xnxx国产精品| 91蜜桃免费观看视频| 亚洲欧美另类图片小说| 欧美探花视频资源| 韩国三级在线一区| 亚洲精品五月天| 日韩一区二区三区高清免费看看| 国产精品一区二区三区99| 亚洲日本护士毛茸茸| 欧美一二三区在线| 91视频观看视频| 奇米影视7777精品一区二区| 欧美精彩视频一区二区三区| 欧美三级三级三级爽爽爽| 国产精品白丝jk白祙喷水网站| 亚洲乱码日产精品bd| 日韩欧美卡一卡二| 99精品偷自拍| 激情图片小说一区| 亚洲小说欧美激情另类| 欧美激情自拍偷拍| 日韩视频一区在线观看| 在线精品视频一区二区| 国产一区二区三区不卡在线观看 | 日日夜夜精品视频免费| 中文字幕不卡在线观看| 精品少妇一区二区三区免费观看| 暴力调教一区二区三区| 老司机精品视频导航| 亚洲成人免费电影| 国产精品乱人伦中文| 2欧美一区二区三区在线观看视频| 欧美日韩在线观看一区二区| 风间由美一区二区三区在线观看 | 国产欧美日韩久久| 日韩精品一区二区三区中文精品| 色老汉av一区二区三区| 风间由美一区二区三区在线观看| 另类成人小视频在线| 五月天欧美精品| 亚洲国产中文字幕| 亚洲综合色视频| 亚洲一区国产视频| 中文字幕一区在线| 中文字幕一区二区在线播放| 国产日本亚洲高清| 国产日本欧洲亚洲| 国产欧美精品一区| 久久久精品黄色| 国产区在线观看成人精品| 久久久综合九色合综国产精品| 日韩视频在线永久播放| 91精品啪在线观看国产60岁| 欧美日韩一区二区三区在线看| 欧美主播一区二区三区| 欧美性生活影院| 91精品国产欧美日韩| 日韩一区二区不卡| 日韩三级中文字幕| 欧美日韩国产高清一区| 91社区在线播放| 成人一级片在线观看| 色综合天天综合狠狠| 一本久久综合亚洲鲁鲁五月天 | 亚洲精品少妇30p| 亚洲韩国精品一区| 日韩电影网1区2区| 免费高清在线视频一区·| 国产最新精品精品你懂的| 国产在线一区观看| 成人av高清在线| 欧美色老头old∨ideo| 日韩丝袜美女视频| 久久九九全国免费| 亚洲色图制服丝袜| 五月婷婷综合激情| 国产成人在线视频网址| 91精品啪在线观看国产60岁| 欧美激情一区二区三区不卡| 午夜精品123| 欧美综合一区二区| 国产欧美一区二区精品婷婷| 五月综合激情日本mⅴ| av在线一区二区|