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

📄 syntaxtree.cpp

📁 一个上课很好用的课件
💻 CPP
字号:
#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 + -