📄 syntaxtree.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 + -