-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExpTree.cpp
More file actions
98 lines (88 loc) · 2.83 KB
/
ExpTree.cpp
File metadata and controls
98 lines (88 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//
// Created by Vallath Nandakumar on 11/15/17.
//
#include "ExpTree.h"
#include "Interpreter.h"
#define DEBUG true
ExpTree::ExpTree(vector<Node*>& expr) { // construct from expression vector
overallRoot = add(overallRoot, expr);
}
// private method
Node* ExpTree::add(Node* root, vector<Node*>& expr) { // passing expr as a reference
Node* first = expr[0]; // store the first element
expr.erase(expr.begin()); // remove the first element
root = first; // root points to the first token Node
if (!(first->isOperand) && !(first->hasSingleOperator)) { // if first is an operator, add 2 operands
root->left = add(root->left, expr);
root->right = add(root->right, expr);
}
else if(!(first->isOperand)){
root->left = add(root->left, expr);
}
return root; // return the new sub-tree
}
void ExpTree::printTree() {
printTree(overallRoot, 0); // call helper method
}
void ExpTree::printSpaces(int level) { // print 4 spaces per level, for indentation
for (int i = 0; i < level*4; i++) {
cout << ' ';
}
}
// private recursive helper method
void ExpTree::printTree(Node* root, int level) {
if (root == nullptr) return;
printTree(root->right, level+1); // print the right sub-tree
printSpaces(level); // print the indentation for the root of sub-tree
root->print(); // print the root
printTree(root->left, level+1); // print the left sub-tree
}
int ExpTree::parse() {
return parse(overallRoot);
}
int ExpTree::parse(Node* root) {
if (root->isOperand) {
//If this operand is a variable, pull it from the variable map
if(root->var != ""){
return vars[root->var];
}else{
return root->operand;
}
}
int arg1 = parse(root->left);
int arg2;
if(!(root->hasSingleOperator)){
arg2 = parse(root->right);
}
if(root->optr == "+"){
return arg1+arg2;
} else if(root->optr == "-"){
return arg1-arg2;
} else if(root->optr == "/"){
return arg1/arg2;
} else if(root->optr== "*") {
return arg1 * arg2;
} else if(root->optr == "=="){
return arg1 == arg2 ? 1 : 0;
} else if(root->optr == "&&"){
return arg1 > 0 && arg2 > 0 ? 1 : 0;
} else if(root->optr == "||"){
return (arg1 > 0 || arg2 > 0) ? 1 : 0;
} else if(root->optr == "!="){
return (arg1 != arg2) ? 1 : 0;
} else if(root->optr == ">"){
return arg1 > arg2 ? 1 : 0;
} else if(root->optr == "<"){
return arg1 < arg2 ? 1 : 0;
} else if(root->optr == "!"){
return (arg1 != 0) ? 0 : 1;
} else if(root->optr == "~"){
return -arg1;
} else if(root->optr == ">="){
return (arg1>=arg2);
}else if(root->optr == "<="){
return (arg1<=arg2);
} else if(root->optr == "%"){
return (arg1%arg2);
}
}