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

📄 syntaxtree.cpp

📁 2006-04-17 作者:ideawu Document for: 用C++语言手工编写的词法分析器,语法分析器。
💻 CPP
字号:
/************************************************************* file: SyntaxTree.cpp* date: 2006-04-12* author: wuzuyang* describe: none; SyntaxTree*************************************************************/#include <stdio.h>#include <string.h>#include "SyntaxTree.h"char* tokenToString(TokenType type);/*======================================================================*/SyntaxTree::SyntaxTree(TokenType t, int val){	root = new SyntaxTreeNode(t, val);}SyntaxTree::SyntaxTree(SyntaxTreeNode *n){	setRootNode(n);}SyntaxTree::SyntaxTree(SyntaxTree *tree){	setRootNode(tree->getRootNode());}SyntaxTree::SyntaxTree(){	setRootNode();}SyntaxTree::~SyntaxTree(){	if(root != NULL){		delete root;	}}/*====================================================================*/void SyntaxTree::display(SyntaxTreeNode *n, int tabcount, FILE *fo){	static int tab[200];	// is it enough?		SyntaxTreeNode * node = n;	if(node == NULL) return;		if(node->type == NUM){		fprintf(fo, "%-3d", node->value);	}else{		fprintf(fo, "%-3s", tokenToString(node->type));	}			if(node->left != NULL){		tab[tabcount] = 1;	}		if(node->right != NULL){		fprintf(fo, "---");		this->display(node->right, tabcount + 1, fo);	}		if(node->left != NULL){		fprintf(fo, "\n");		for(int i=0;i<tabcount;i++){			if(tab[i] == 1){				fprintf(fo, "|%5s", "");			}else{				fprintf(fo, "%6s", "");			}		}		fprintf(fo, "+-----");		tab[tabcount] = 0;		this->display(node->left, tabcount + 1, fo);	}	}void SyntaxTree::display(FILE *fo){	if(fo == NULL){		fo = stdout;		printf("\nFILE* NULL, will write to STDOUT.\n\n");	}			fprintf(fo, "\n");	this->display(root, 0, fo);	fprintf(fo, "\n");}void SyntaxTree::setRootNode(TokenType t, int val){	root = new SyntaxTreeNode(t, val);}void SyntaxTree::setRootNode(SyntaxTreeNode *n){	if(n == NULL){		root = new SyntaxTreeNode();	}else{		root = n;	}}void SyntaxTree::setRootNode(){	root = new SyntaxTreeNode();}void SyntaxTree::addLeft(TokenType t, int val){	root->left = new SyntaxTreeNode(t, val);}void SyntaxTree::addLeft(SyntaxTree *n){	if(n == NULL) return;	root->left = n->getRootNode();}void SyntaxTree::addRight(TokenType t, int val){	root->right = new SyntaxTreeNode(t, val);}void SyntaxTree::addRight(SyntaxTree *n){	if(n == NULL) return;	root->right = n->getRootNode();}void SyntaxTree::addChild3(TokenType t, int val){	root->child3 = new SyntaxTreeNode(t, val);}void SyntaxTree::addChild3(SyntaxTree *n){	if(n == NULL) return;	root->child3 = n->getRootNode();}SyntaxTreeNode* SyntaxTree::getRootNode(){	return root;}SyntaxTree* SyntaxTree::getLeft(){	if(root->left == NULL)		return NULL;	else		return new SyntaxTree(root->left);}SyntaxTree* SyntaxTree::getRight(){	if(root->right == NULL)		return NULL;	else		return new SyntaxTree(root->right);}SyntaxTree* SyntaxTree::getChild3(){	if(root->child3 == NULL)		return NULL;	else		return new SyntaxTree(root->child3);}/*==================================================================*/char* tokenToString(TokenType type){	char *s = NULL;	switch(type){		case ID:			s = "ID";			break;		case NUM:			s = "NUM";			break;		case IF:			s = "if";			break;		case THEN:			s = "thn";			break;		case ELSE:			s = "els";			break;		case WHILE:			s = "whl";			break;		case DO:			s = "do";			break;		case BEGIN:			s = "blk";			break;		case END:			s = "end";	// "end"			break;		case ASSIGN:			s = "'='";			break;		case EQ:			s = "==";			break;		case LT:			s = "'<'";			break;		case GT:			s = "'>'";			break;		case PLUS:			s = "'+'";			break;		case MUL:			s = "'*'";			break;		case MINUS:			s = "'-'";			break;		case DIV:			s = "'/'";			break;		case OR:			s = "'|'";			break;		case AND:			s = "'&'";			break;		default:			s = "undef";	}	return s;}

⌨️ 快捷键说明

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