index
  1  /************************************************************
  2  * file: SyntaxTree.cpp
  3  * date: 2006-04-12
  4  * author: ideawu
  5  * describe: none; SyntaxTree
  6  *************************************************************/
  7
  8  #include <stdio.h>
  9  #include <string.h>
 10  #include "SyntaxTree.h"
 11
 12
 13  char* tokenToString(TokenType type);
 14
 15  /*======================================================================*/
 16
 17  SyntaxTree::SyntaxTree(TokenType t, int val){
 18      root = new SyntaxTreeNode(t, val);
 19  }
 20  SyntaxTree::SyntaxTree(SyntaxTreeNode *n){
 21      setRootNode(n);
 22  }
 23  SyntaxTree::SyntaxTree(SyntaxTree *tree){
 24      setRootNode(tree->getRootNode());
 25  }
 26  SyntaxTree::SyntaxTree(){
 27      setRootNode();
 28  }
 29
 30  SyntaxTree::~SyntaxTree(){
 31      if(root != NULL){
 32          delete root;
 33      }
 34  }
 35
 36  /*====================================================================*/
 37
 38  void SyntaxTree::display(SyntaxTreeNode *n, int tabcount, FILE *fo){
 39      static int tab[200];    // is it enough?
 40
 41      SyntaxTreeNode * node = n;
 42      if(node == NULL) return;
 43
 44      if(node->type == NUM){
 45          fprintf(fo, "%-3d", node->value);
 46      }else{
 47          fprintf(fo, "%-3s", tokenToString(node->type));
 48      }
 49
 50      if(node->left != NULL){
 51          tab[tabcount] = 1;
 52      }
 53
 54      if(node->right != NULL){
 55          fprintf(fo, "---");
 56          this->display(node->right, tabcount + 1, fo);
 57      }
 58
 59      if(node->left != NULL){
 60          fprintf(fo, "\n");
 61          for(int i=0;i<tabcount;i++){
 62              if(tab[i] == 1){
 63                  fprintf(fo, "|%5s", "");
 64              }else{
 65                  fprintf(fo, "%6s", "");
 66              }
 67          }
 68          fprintf(fo, "+-----");
 69          tab[tabcount] = 0;
 70          this->display(node->left, tabcount + 1, fo);
 71      }
 72
 73  }
 74
 75  void SyntaxTree::display(FILE *fo){
 76      if(fo == NULL){
 77          fo = stdout;
 78          printf("\nFILE* NULL, will write to STDOUT.\n\n");
 79      }
 80
 81      fprintf(fo, "\n");
 82      this->display(root, 0, fo);
 83      fprintf(fo, "\n");
 84  }
 85
 86
 87  void SyntaxTree::setRootNode(TokenType t, int val){
 88      root = new SyntaxTreeNode(t, val);
 89  }
 90  void SyntaxTree::setRootNode(SyntaxTreeNode *n){
 91      if(n == NULL){
 92          root = new SyntaxTreeNode();
 93      }else{
 94          root = n;
 95      }
 96  }
 97  void SyntaxTree::setRootNode(){
 98      root = new SyntaxTreeNode();
 99  }
100
101
102  void SyntaxTree::addLeft(TokenType t, int val){
103      root->left = new SyntaxTreeNode(t, val);
104  }
105  void SyntaxTree::addLeft(SyntaxTree *n){
106      if(n == NULL) return;
107      root->left = n->getRootNode();
108  }
109
110
111  void SyntaxTree::addRight(TokenType t, int val){
112      root->right = new SyntaxTreeNode(t, val);
113  }
114  void SyntaxTree::addRight(SyntaxTree *n){
115      if(n == NULL) return;
116      root->right = n->getRootNode();
117  }
118
119
120  void SyntaxTree::addChild3(TokenType t, int val){
121      root->child3 = new SyntaxTreeNode(t, val);
122  }
123  void SyntaxTree::addChild3(SyntaxTree *n){
124      if(n == NULL) return;
125      root->child3 = n->getRootNode();
126  }
127
128
129  SyntaxTreeNode* SyntaxTree::getRootNode(){
130      return root;
131  }
132
133
134  SyntaxTree* SyntaxTree::getLeft(){
135      if(root->left == NULL)
136          return NULL;
137      else
138          return new SyntaxTree(root->left);
139  }
140
141  SyntaxTree* SyntaxTree::getRight(){
142      if(root->right == NULL)
143          return NULL;
144      else
145          return new SyntaxTree(root->right);
146  }
147
148
149  SyntaxTree* SyntaxTree::getChild3(){
150      if(root->child3 == NULL)
151          return NULL;
152      else
153          return new SyntaxTree(root->child3);
154  }
155
156  /*==================================================================*/
157
158  char* tokenToString(TokenType type){
159      char *s = NULL;
160      switch(type){
161          case ID:
162              s = "ID";
163              break;
164          case NUM:
165              s = "NUM";
166              break;
167          case IF:
168              s = "if";
169              break;
170          case THEN:
171              s = "thn";
172              break;
173          case ELSE:
174              s = "els";
175              break;
176          case WHILE:
177              s = "whl";
178              break;
179          case DO:
180              s = "do";
181              break;
182          case BEGIN:
183              s = "blk";
184              break;
185          case END:
186              s = "end";  // "end"
187              break;
188          case ASSIGN:
189              s = "'='";
190              break;
191          case EQ:
192              s = "==";
193              break;
194          case LT:
195              s = "'<'";
196              break;
197          case GT:
198              s = "'>'";
199              break;
200          case PLUS:
201              s = "'+'";
202              break;
203          case MUL:
204              s = "'*'";
205              break;
206          case MINUS:
207              s = "'-'";
208              break;
209          case DIV:
210              s = "'/'";
211              break;
212          case OR:
213              s = "'|'";
214              break;
215          case AND:
216              s = "'&'";
217              break;
218          default:
219              s = "undef";
220      }
221      return s;
222  }
223
224
225