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