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

📄 temp.txt

📁 一个编译器
💻 TXT
📖 第 1 页 / 共 5 页
字号:
   528		}// end while   529		   530		if(next==false){   531			index --;   532		}   533		   534		if(bufindex == TOKENBUFSIZE - 1){   535			// OUT OF BUFFER! It should never happen.   536			token.type = ERROR;   537			token.name = "OUT OF BUFFER!";   538		}   539		   540		if(bufindex!=0){   541			buf[bufindex] = '\0';   542			token.name = new char[bufindex];   543			strcpy(token.name, buf);   544			if(token.type==ID){	// looking for reserved word and set the right type   545				reservedLookup(token);   546			}   547		}   548		   549		return token;   550	}   551	   552	   553	// looking for reserved word and set the right type   554	void reservedLookup(Token &token){   555		for(int i=0;i<MAXRESERVED;i++){   556			if(strcmp(token.name, ReservedWords[i].name)==0){   557				token.type = ReservedWords[i].type;   558				if(token.type == BEGIN)   559					token.name = "{";   560				if(token.type == END)   561					token.name = "}";   562				break;   563			}   564		}   565	}   566	   567	   568	void getSingleOperator(char c, Token &token){   569		switch(c){   570			case '{':   571				token.type = BEGIN;   572				token.name = "{";   573				break;   574			case '}':   575				token.type = END;   576				token.name = "}";   577				break;   578			case '+':   579				token.type = PLUS;   580				token.name = "+";   581				break;   582			case '*':   583				token.type = MUL;   584				token.name = "*";   585				break;   586			case '#':   587			case '\0':	// end of file   588				token.type = LEXER_DONE;   589				token.name = "FINISH";   590				break;   591			case '&':   592				token.type = AND;   593				token.name = "&";   594				break;   595			case '|':   596				token.type = OR;   597				token.name = "|";   598				break;   599			case ';':   600				token.type = SEMI;   601				token.name = ";";   602				break;   603			default:   604				token.type = ERROR;   605				token.name = "ERROR! Unknown character.";   606				printf("Error occured when state=START! Current character is: %c\n", c);   607				break;   608		}   609	}   610	   611	   612	   613	/************************************************************   614	* file: SyntaxTreeNode.h   615	* date: 2006-04-12   616	* author: wuzuyang   617	* describe: none; SyntaxTreeNode   618	*************************************************************/   619	   620	#include <stdio.h>   621	#include "common.h"   622	   623	class SyntaxTreeNode{   624	private:   625		TokenType type;   626		int value;	// identifiers will be given distinguish values.   627		SyntaxTreeNode *left, *right, *child3;   628		   629	public:   630		SyntaxTreeNode();   631		SyntaxTreeNode::SyntaxTreeNode(TokenType t, int val);   632		~SyntaxTreeNode();   633		   634		void setType(TokenType t);   635		void setValue(int val);   636		   637		TokenType getType();   638		int getValue();   639		   640		void addLeft(TokenType t, int val);   641		// add the subtree n to this tree's left   642		void addLeft(SyntaxTreeNode *n);   643		   644		void addRight(TokenType t, int val);   645		// add the subtree n to this tree's right   646		void addRight(SyntaxTreeNode *n);   647		   648		void addChild3(TokenType t, int val);   649		// add the subtree n to this tree's child3   650		void addChild3(SyntaxTreeNode *n);   651		   652		SyntaxTreeNode* getRootNode();   653		   654		SyntaxTreeNode* getLeft();   655		SyntaxTreeNode* getRight();   656		SyntaxTreeNode* getChild3();   657		   658		friend class SyntaxTree;   659	};   660	   661	   662	   663	/************************************************************   664	* file: SyntaxTreeNode.cpp   665	* date: 2006-04-12   666	* author: wuzuyang   667	* describe: none; SyntaxTreeNode   668	*************************************************************/   669	   670	#include "SyntaxTreeNode.h"   671	   672	   673	SyntaxTreeNode::SyntaxTreeNode(){   674		type = ERROR;   675		value = 0;   676		left = right = child3 = NULL;   677	}   678	SyntaxTreeNode::SyntaxTreeNode(TokenType t, int val){   679		type = t;   680		value = val;   681		left = right = child3 = NULL;   682	}   683	   684	SyntaxTreeNode::~SyntaxTreeNode(){   685	}   686	   687	/*===================================================================*/   688	   689	void SyntaxTreeNode::setType(TokenType t){   690		type = t;   691	}   692	   693	TokenType SyntaxTreeNode::getType(){   694		return type;   695	}   696	   697	void SyntaxTreeNode::setValue(int val){   698		value = val;   699	}   700	   701	int SyntaxTreeNode::getValue(){   702		return value;   703	}   704	   705	   706	void SyntaxTreeNode::addLeft(TokenType t, int val){   707		left = new SyntaxTreeNode(t, val);   708	}   709	void SyntaxTreeNode::addLeft(SyntaxTreeNode *n){   710		left = n;   711	}   712	   713	   714	void SyntaxTreeNode::addRight(TokenType t, int val){   715		right = new SyntaxTreeNode(t, val);   716	}   717	void SyntaxTreeNode::addRight(SyntaxTreeNode *n){   718		right = n;   719	}   720	   721	   722	void SyntaxTreeNode::addChild3(TokenType t, int val){   723		child3 = new SyntaxTreeNode(t, val);   724	}   725	void SyntaxTreeNode::addChild3(SyntaxTreeNode *n){   726		child3 = n;   727	}   728	   729	   730	SyntaxTreeNode* SyntaxTreeNode::getLeft(){   731		return left;   732	}   733	   734	SyntaxTreeNode* SyntaxTreeNode::getRight(){   735		return right;   736	}   737	   738	SyntaxTreeNode* SyntaxTreeNode::getChild3(){   739		return child3;   740	}   741	   742	   743	   744	/************************************************************   745	* file: SyntaxTree.h   746	* date: 2006-04-12   747	* author: wuzuyang   748	* describe: none; SyntaxTree   749	*************************************************************/   750	   751	#include "common.h"   752	#include "SyntaxTreeNode.h"   753	   754	class SyntaxTree{   755	private:   756		SyntaxTreeNode *root;   757		   758	public:   759		SyntaxTree(TokenType t, int val=0);   760		// make a new root node with the same type and val as n, but not other   761		SyntaxTree(SyntaxTreeNode *n);   762		SyntaxTree(SyntaxTree *tree);   763		SyntaxTree();	// with root->type = ERROR   764		~SyntaxTree();   765		   766		void display(FILE *fo=stdout);   767		void display(SyntaxTreeNode *n, int tabcount, FILE *fo=stdout);   768		   769		void setRootNode();   770		void setRootNode(TokenType t, int val=0);   771		// make a new root node with the same type and val as n, but not other   772		void setRootNode(SyntaxTreeNode *n);   773		   774		void addLeft(TokenType t, int val=0);   775		// add the subtree n to this tree's left   776		void addLeft(SyntaxTree *n);   777		   778		void addRight(TokenType t, int val=0);   779		// add the subtree n to this tree's right   780		void addRight(SyntaxTree *n);   781		   782		void addChild3(TokenType t, int val=0);   783		// add the subtree n to this tree's child3   784		void addChild3(SyntaxTree *n);   785		   786		SyntaxTreeNode* getRootNode();   787		   788		SyntaxTree* getLeft();   789		SyntaxTree* getRight();   790		SyntaxTree* getChild3();   791	   792	};   793	   794	   795	   796	/************************************************************   797	* file: SyntaxTree.cpp   798	* date: 2006-04-12   799	* author: wuzuyang   800	* describe: none; SyntaxTree   801	*************************************************************/   802	   803	#include <stdio.h>   804	#include <string.h>   805	#include "SyntaxTree.h"   806	   807	   808	char* tokenToString(TokenType type);   809	   810	/*======================================================================*/   811	   812	SyntaxTree::SyntaxTree(TokenType t, int val){   813		root = new SyntaxTreeNode(t, val);   814	}   815	SyntaxTree::SyntaxTree(SyntaxTreeNode *n){   816		setRootNode(n);   817	}   818	SyntaxTree::SyntaxTree(SyntaxTree *tree){   819		setRootNode(tree->getRootNode());   820	}   821	SyntaxTree::SyntaxTree(){   822		setRootNode();   823	}   824	   825	SyntaxTree::~SyntaxTree(){   826		// implement it later.   827	}   828	   829	/*====================================================================*/   830	   831	void SyntaxTree::display(SyntaxTreeNode *n, int tabcount, FILE *fo){   832		static int tab[200];	// is it enough?   833		   834		SyntaxTreeNode * node = n;   835		if(node == NULL) return;   836		   837		if(node->type == NUM){   838			fprintf(fo, "%-3d", node->value);   839		}else{   840			fprintf(fo, "%-3s", tokenToString(node->type));   841		}   842			   843		if(node->left != NULL){   844			tab[tabcount] = 1;   845		}   846		   847		if(node->right != NULL){   848			fprintf(fo, "---");   849			this->display(node->right, tabcount + 1, fo);   850		}   851		   852		if(node->left != NULL){   853			fprintf(fo, "\n");   854			for(int i=0;i<tabcount;i++){   855				if(tab[i] == 1){   856					fprintf(fo, "|%5s", "");   857				}else{   858					fprintf(fo, "%6s", "");   859				}   860			}   861			fprintf(fo, "+-----");   862			tab[tabcount] = 0;   863			this->display(node->left, tabcount + 1, fo);   864		}   865		   866	}   867	   868	void SyntaxTree::display(FILE *fo){   869		if(fo == NULL){   870			fo = stdout;   871			printf("\nFILE* NULL, will write to STDOUT.\n\n");   872		}   873			   874		fprintf(fo, "\n");   875		this->display(root, 0, fo);   876		fprintf(fo, "\n");   877	}   878	   879	   880	void SyntaxTree::setRootNode(TokenType t, int val){   881		root = new SyntaxTreeNode(t, val);   882	}   883	void SyntaxTree::setRootNode(SyntaxTreeNode *n){   884		if(n == NULL){   885			root = new SyntaxTreeNode();   886		}else{   887			root = n;   888		}   889	}   890	void SyntaxTree::setRootNode(){   891		root = new SyntaxTreeNode();   892	}   893	   894	   895	void SyntaxTree::addLeft(TokenType t, int val){   896		root->left = new SyntaxTreeNode(t, val);   897	}   898	void SyntaxTree::addLeft(SyntaxTree *n){   899		if(n == NULL) return;   900		root->left = n->getRootNode();   901	}   902	   903	   904	void SyntaxTree::addRight(TokenType t, int val){   905		root->right = new SyntaxTreeNode(t, val);   906	}   907	void SyntaxTree::addRight(SyntaxTree *n){   908		if(n == NULL) return;   909		root->right = n->getRootNode();   910	}   911	   912	   913	void SyntaxTree::addChild3(TokenType t, int val){   914		root->child3 = new SyntaxTreeNode(t, val);   915	}   916	void SyntaxTree::addChild3(SyntaxTree *n){   917		if(n == NULL) return;   918		root->child3 = n->getRootNode();   919	}   920	   921	   922	SyntaxTreeNode* SyntaxTree::getRootNode(){   923		return root;   924	}   925	   926	   927	SyntaxTree* SyntaxTree::getLeft(){   928		return new SyntaxTree(root->left);   929	}   930	   931	SyntaxTree* SyntaxTree::getRight(){   932		return new SyntaxTree(root->right);   933	}   934	   935	   936	SyntaxTree* SyntaxTree::getChild3(){   937		return new SyntaxTree(root->child3);   938	}   939	   940	/*==================================================================*/   941	   942	char* tokenToString(TokenType type){   943		char *s = NULL;   944		switch(type){   945			case ID:   946				s = "ID";   947				break;   948			case NUM:   949				s = "NUM";   950				break;   951			case IF:   952				s = "if";   953				break;   954			case THEN:   955				s = "thn";   956				break;   957			case ELSE:   958				s = "els";   959				break;   960			case WHILE:   961				s = "whl";   962				break;   963			case DO:   964				s = "do";   965				break;   966			case BEGIN:   967				s = "blk";   968				break;   969			case END:   970				s = "end";	// "end"   971				break;   972			case ASSIGN:   973				s = "'='";   974				break;   975			case EQ:   976				s = "==";   977				break;   978			case LT:   979				s = "'<'";   980				break;   981			case GT:   982				s = "'>'";   983				break;   984			case PLUS:   985				s = "'+'";   986				break;   987			case MUL:   988				s = "'*'";   989				break;   990			case OR:   991				s = "'|'";   992				break;   993			case AND:   994				s = "'&'";   995				break;   996			default:   997				s = "undef";   998		}   999		return s;  1000	}  1001	  1002	  1003	  1004	/**************************************************  1005	* file: Parser.h  1006	* date: 2006-04-12  1007	* author: wuzuyang  1008	* describe: none; parser  1009	**************************************************/  1010	  1011	#include "common.h"  1012	#include "Lexer.h"  1013	#include "SyntaxTree.h"  1014	  1015	  1016	class Parser{  1017	private:  1018		Lexer *lexer;  1019		Token currentToken;  1020		  1021		SyntaxTree* Statement();  1022		  1023		SyntaxTree* Assign();  1024		  1025		SyntaxTree* Expression();  1026			SyntaxTree* T();  1027			SyntaxTree* F();  1028	  1029		SyntaxTree* Condition();  1030		  1031		SyntaxTree* Boolean();  1032			SyntaxTree* T2();  1033			SyntaxTree* F2();  1034		SyntaxTree* While();  1035		  1036		SyntaxTree* Begin();  1037	  1038		SyntaxTree* Block();  1039	  1040		void printError(const char *error);  1041	  1042	public:  1043		Parser(char* sourcefile);  1044		~Parser();  1045		  1046		void printError();  1047	  1048		Token nextToken();  1049		  1050		SyntaxTree* parse();  1051	};  1052	  1053	  1054	

⌨️ 快捷键说明

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