⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 temp.txt

📁 一个编译器
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  2109		}  2110		  2111		TRACE("out Boolean();");  2112		return tree;  2113	}  2114	  2115	  2116	SyntaxTree* Parser::T2(){  2117		SyntaxTree *temp = NULL;  2118		SyntaxTree *tree = F2();  2119	  2120		if(tree == NULL){  2121			return NULL;  2122		}  2123		  2124		while(currentToken.type == AND){  2125			temp = new SyntaxTree(AND);  2126			temp->addLeft(tree);  2127			tree = temp;  2128			this->nextToken();  2129			  2130			temp = F2();  2131			if(temp != NULL){  2132				tree->addRight(temp);  2133			}else{  2134				this->printError("ERROR! behind AND;");  2135				return NULL;  2136			}  2137		}  2138		  2139		return tree;  2140	}  2141	  2142	  2143	SyntaxTree* Parser::F2(){  2144		SyntaxTree *temp = NULL;  2145		SyntaxTree *tree = Expression();  2146		  2147		if(tree == NULL){  2148			return NULL;  2149		}  2150		  2151		switch(currentToken.type){  2152			case LT:  2153				temp = new SyntaxTree(LT);  2154				break;  2155			case GT:  2156				temp = new SyntaxTree(GT);  2157				break;  2158			case EQ:  2159				temp = new SyntaxTree(EQ);  2160				break;  2161			default :  2162				break;  2163		}  2164		  2165		if(temp != NULL){  2166			this->nextToken();  2167			temp->addLeft(tree);  2168			tree = temp;  2169			temp = Expression();  2170			if(temp != NULL){  2171				tree->addRight(temp);  2172			}else{  2173				this->printError("ERROR! Relation Operator needs Expression behind;");  2174				return NULL;  2175			}  2176		}  2177	  2178		return tree;  2179	}  2180	  2181	/*==================================================================*/  2182	  2183	SyntaxTree* Parser::While(){  2184		TRACE("in While();");  2185	  2186		SyntaxTree *tree = new SyntaxTree(WHILE);  2187		SyntaxTree *temp = Boolean();  2188		  2189		if(temp == NULL){  2190			this->printError("ERROR! in While(); Condition NULL;");  2191			return NULL;  2192		}  2193		tree->addLeft(temp);  2194		  2195		if(currentToken.type != DO){  2196			this->printError("ERROR! in While(); token.type!=DO;");  2197			return NULL;  2198		}  2199		this->nextToken();  2200		temp = Statement();  2201	  2202		if(temp == NULL){  2203			this->printError("ERROR! in While(); DO empty;");  2204			return NULL;  2205		}  2206		tree->addRight(temp);  2207		  2208		TRACE("out While();");  2209		return tree;  2210	}  2211	  2212	  2213	/*==================================================================*/  2214	  2215	SyntaxTree* Parser::Begin(){  2216		return Block();  2217	}  2218	  2219	/*  2220		L = S(;S)* | <empsilon>  2221	*/  2222	SyntaxTree* Parser::Block(){  2223		TRACE("in Block();");  2224	  2225		SyntaxTree *tree = Statement();  2226		SyntaxTree *temp = new SyntaxTree(BEGIN);  2227		  2228		if(tree == NULL){  2229			//this->printError("WARNNING! Don't accept empty block.");  2230			return NULL;  2231			/*  2232			while(currentToken.type == SEMI){  2233				this->nextToken();  2234			}  2235			return new SyntaxTree(BEGIN);  2236			*/  2237		}  2238		temp->addLeft(tree);  2239		tree = temp;  2240		  2241	//	temp = L2();  2242	  2243		while(currentToken.type == SEMI){  2244			this->nextToken();  2245		}  2246		temp = Block();  2247	  2248		if(temp != NULL){	// it couldn't be  2249			if(temp->getLeft() != NULL)  2250				tree->addRight(temp);  2251		}  2252		  2253		TRACE("out Block();");  2254	  2255		if(tree == NULL)  2256			return NULL;  2257		if(tree->getRight() == NULL)  2258			return tree->getLeft();  2259		else  2260			return tree;  2261	}  2262	  2263	  2264	/*==================================================================*/  2265	  2266	  2267	SyntaxTree* Parser::Condition(){  2268		TRACE("in Condition();");  2269		  2270		SyntaxTree *tree = new SyntaxTree(IF);  2271		SyntaxTree *temp = Boolean();  2272		SyntaxTree *temp2 = NULL;  2273		  2274		if(temp == NULL){  2275			this->printError("ERROR! if without a boolean statement.");  2276			return NULL;  2277		}  2278		tree->addLeft(temp);  2279		  2280		if(currentToken.type != THEN){  2281			this->printError("ERROR! if without then.");  2282			return NULL;  2283		}  2284		this->nextToken();  2285		temp = Statement();  2286		  2287		if(temp == NULL){  2288			this->printError("ERROR! then without a statement.");  2289			return NULL;  2290		}  2291		  2292		temp2 = new SyntaxTree(THEN);  2293		temp2->addLeft(temp);  2294		  2295		//temp2 = temp;  2296		  2297		this->nextToken();  2298		if(currentToken.type == ELSE){  2299			TRACE("ELSE");  2300			this->nextToken();  2301			//temp = new SyntaxTree(BEGIN);  2302			//temp->addLeft(temp2);  2303			//temp2 = temp;  2304			  2305			temp = Statement();  2306			if(temp == NULL){  2307				this->printError("ERROR! else without a statement.");  2308				return NULL;  2309			}  2310			temp2->addRight(temp);  2311		}  2312		  2313		tree->addRight(temp2);  2314		  2315		TRACE("out Condition();");  2316		return tree;  2317	}  2318	  2319	  2320	  2321	  2322	/************************************************************  2323	* file: SyntaxTree.cpp  2324	* date: 2006-04-12  2325	* author: wuzuyang  2326	* describe: none; SyntaxTree  2327	*************************************************************/  2328	  2329	#include <stdio.h>  2330	#include <string.h>  2331	#include "SyntaxTree.h"  2332	  2333	  2334	char* tokenToString(TokenType type);  2335	  2336	/*======================================================================*/  2337	  2338	SyntaxTree::SyntaxTree(TokenType t, int val){  2339		root = new SyntaxTreeNode(t, val);  2340	}  2341	SyntaxTree::SyntaxTree(SyntaxTreeNode *n){  2342		setRootNode(n);  2343	}  2344	SyntaxTree::SyntaxTree(SyntaxTree *tree){  2345		setRootNode(tree->getRootNode());  2346	}  2347	SyntaxTree::SyntaxTree(){  2348		setRootNode();  2349	}  2350	  2351	SyntaxTree::~SyntaxTree(){  2352		// implement it later.  2353	}  2354	  2355	/*====================================================================*/  2356	  2357	void SyntaxTree::display(SyntaxTreeNode *n, int tabcount, FILE *fo){  2358		static int tab[200];	// is it enough?  2359		  2360		SyntaxTreeNode * node = n;  2361		if(node == NULL) return;  2362		  2363		if(node->type == NUM){  2364			fprintf(fo, "%-3d", node->value);  2365		}else{  2366			fprintf(fo, "%-3s", tokenToString(node->type));  2367		}  2368			  2369		if(node->left != NULL){  2370			tab[tabcount] = 1;  2371		}  2372		  2373		if(node->right != NULL){  2374			fprintf(fo, "---");  2375			this->display(node->right, tabcount + 1, fo);  2376		}  2377		  2378		if(node->left != NULL){  2379			fprintf(fo, "\n");  2380			for(int i=0;i<tabcount;i++){  2381				if(tab[i] == 1){  2382					fprintf(fo, "|%5s", "");  2383				}else{  2384					fprintf(fo, "%6s", "");  2385				}  2386			}  2387			fprintf(fo, "+-----");  2388			tab[tabcount] = 0;  2389			this->display(node->left, tabcount + 1, fo);  2390		}  2391		  2392	}  2393	  2394	void SyntaxTree::display(FILE *fo){  2395		if(fo == NULL){  2396			fo = stdout;  2397			printf("\nFILE* NULL, will write to STDOUT.\n\n");  2398		}  2399			  2400		fprintf(fo, "\n");  2401		this->display(root, 0, fo);  2402		fprintf(fo, "\n");  2403	}  2404	  2405	  2406	void SyntaxTree::setRootNode(TokenType t, int val){  2407		root = new SyntaxTreeNode(t, val);  2408	}  2409	void SyntaxTree::setRootNode(SyntaxTreeNode *n){  2410		if(n == NULL){  2411			root = new SyntaxTreeNode();  2412		}else{  2413			root = n;  2414		}  2415	}  2416	void SyntaxTree::setRootNode(){  2417		root = new SyntaxTreeNode();  2418	}  2419	  2420	  2421	void SyntaxTree::addLeft(TokenType t, int val){  2422		root->left = new SyntaxTreeNode(t, val);  2423	}  2424	void SyntaxTree::addLeft(SyntaxTree *n){  2425		if(n == NULL) return;  2426		root->left = n->getRootNode();  2427	}  2428	  2429	  2430	void SyntaxTree::addRight(TokenType t, int val){  2431		root->right = new SyntaxTreeNode(t, val);  2432	}  2433	void SyntaxTree::addRight(SyntaxTree *n){  2434		if(n == NULL) return;  2435		root->right = n->getRootNode();  2436	}  2437	  2438	  2439	void SyntaxTree::addChild3(TokenType t, int val){  2440		root->child3 = new SyntaxTreeNode(t, val);  2441	}  2442	void SyntaxTree::addChild3(SyntaxTree *n){  2443		if(n == NULL) return;  2444		root->child3 = n->getRootNode();  2445	}  2446	  2447	  2448	SyntaxTreeNode* SyntaxTree::getRootNode(){  2449		return root;  2450	}  2451	  2452	  2453	SyntaxTree* SyntaxTree::getLeft(){  2454		if(root->left == NULL)  2455			return NULL;  2456		else  2457			return new SyntaxTree(root->left);  2458	}  2459	  2460	SyntaxTree* SyntaxTree::getRight(){  2461		if(root->right == NULL)  2462			return NULL;  2463		else  2464			return new SyntaxTree(root->right);  2465	}  2466	  2467	  2468	SyntaxTree* SyntaxTree::getChild3(){  2469		if(root->child3 == NULL)  2470			return NULL;  2471		else  2472			return new SyntaxTree(root->child3);  2473	}  2474	  2475	/*==================================================================*/  2476	  2477	char* tokenToString(TokenType type){  2478		char *s = NULL;  2479		switch(type){  2480			case ID:  2481				s = "ID";  2482				break;  2483			case NUM:  2484				s = "NUM";  2485				break;  2486			case IF:  2487				s = "if";  2488				break;  2489			case THEN:  2490				s = "thn";  2491				break;  2492			case ELSE:  2493				s = "els";  2494				break;  2495			case WHILE:  2496				s = "whl";  2497				break;  2498			case DO:  2499				s = "do";  2500				break;  2501			case BEGIN:  2502				s = "blk";  2503				break;  2504			case END:  2505				s = "end";	// "end"  2506				break;  2507			case ASSIGN:  2508				s = "'='";  2509				break;  2510			case EQ:  2511				s = "==";  2512				break;  2513			case LT:  2514				s = "'<'";  2515				break;  2516			case GT:  2517				s = "'>'";  2518				break;  2519			case PLUS:  2520				s = "'+'";  2521				break;  2522			case MUL:  2523				s = "'*'";  2524				break;  2525			case OR:  2526				s = "'|'";  2527				break;  2528			case AND:  2529				s = "'&'";  2530				break;  2531			default:  2532				s = "undef";  2533		}  2534		return s;  2535	}  2536	  2537	  2538	  2539	/************************************************************  2540	* file: SyntaxTreeNode.cpp  2541	* date: 2006-04-12  2542	* author: wuzuyang  2543	* describe: none; SyntaxTreeNode  2544	*************************************************************/  2545	  2546	#include "SyntaxTreeNode.h"  2547	  2548	  2549	SyntaxTreeNode::SyntaxTreeNode(){  2550		type = ERROR;  2551		value = 0;  2552		left = right = child3 = NULL;  2553	}  2554	SyntaxTreeNode::SyntaxTreeNode(TokenType t, int val){  2555		type = t;  2556		value = val;  2557		left = right = child3 = NULL;  2558	}  2559	  2560	SyntaxTreeNode::~SyntaxTreeNode(){  2561	}  2562	  2563	/*===================================================================*/  2564	  2565	void SyntaxTreeNode::setType(TokenType t){  2566		type = t;  2567	}  2568	  2569	TokenType SyntaxTreeNode::getType(){  2570		return type;  2571	}  2572	  2573	void SyntaxTreeNode::setValue(int val){  2574		value = val;  2575	}  2576	  2577	int SyntaxTreeNode::getValue(){  2578		return value;  2579	}  2580	  2581	  2582	void SyntaxTreeNode::addLeft(TokenType t, int val){  2583		left = new SyntaxTreeNode(t, val);  2584	}  2585	void SyntaxTreeNode::addLeft(SyntaxTreeNode *n){  2586		left = n;  2587	}  2588	  2589	  2590	void SyntaxTreeNode::addRight(TokenType t, int val){  2591		right = new SyntaxTreeNode(t, val);  2592	}  2593	void SyntaxTreeNode::addRight(SyntaxTreeNode *n){  2594		right = n;  2595	}  2596	  2597	  2598	void SyntaxTreeNode::addChild3(TokenType t, int val){  2599		child3 = new SyntaxTreeNode(t, val);  2600	}  2601	void SyntaxTreeNode::addChild3(SyntaxTreeNode *n){  2602		child3 = n;  2603	}  2604	  2605	  2606	SyntaxTreeNode* SyntaxTreeNode::getLeft(){  2607		return left;  2608	}  2609	  2610	SyntaxTreeNode* SyntaxTreeNode::getRight(){  2611		return right;  2612	}  2613	  2614	SyntaxTreeNode* SyntaxTreeNode::getChild3(){  2615		return child3;  2616	}  2617	  2618	  2619	  2620	  2621	#include <stdio.h>  2622	#include <unistd.h>  2623	#include <sys/stat.h>  2624	#include <fcntl.h>  2625	  2626	int main(){  2627		int fd = open("myfile.txt", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);  2628		if(fd != -1){  2629			if(dup2(fd, STDOUT_FILENO) == -1){  2630				printf("can't close file!\n");  2631				return 1;  2632			}  2633	  2634			printf

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -