31bool parse(std::string expression, std::shared_ptr<Expression> &root)
35 std::stack<std::shared_ptr<Expression>> outputStack;
36 std::stack<std::string> operatorStack;
38 std::vector<std::string> tokens =
tokenize(expression);
40 for (
auto token : tokens)
42 if (token.length() == 1 && islower(token[0]) || token ==
TRUE ||
48 std::shared_ptr<Expression> leaf(
new Expression(token));
49 outputStack.push(leaf);
52 if (!operatorStack.empty() && operatorStack.top() ==
NOT)
54 while (!operatorStack.empty() && operatorStack.top() ==
NOT)
56 std::string operatorStr = operatorStack.top();
59 std::shared_ptr<Expression> operand = outputStack.top();
62 std::shared_ptr<Expression> operatorPtr(
new Expression(operatorStr));
64 operatorPtr->setLeft(operand, operatorPtr);
65 outputStack.push(operatorPtr);
70 else if (token ==
NOT)
74 operatorStack.push(token);
76 else if (token ==
AND || token ==
OR || token ==
XOR || token ==
IFF ||
79 while (!operatorStack.empty() && operatorStack.top() !=
OPEN &&
80 precedence.at(operatorStack.top()) >= precedence.at(token))
86 std::string operatorStr = operatorStack.top();
89 std::shared_ptr<Expression> operatorPtr(
new Expression(operatorStr));
91 if (outputStack.size() < 2)
93 std::shared_ptr<Expression> right = outputStack.top();
96 std::shared_ptr<Expression> left = outputStack.top();
99 operatorPtr->setLeft(left, operatorPtr);
100 operatorPtr->setRight(right, operatorPtr);
102 outputStack.push(operatorPtr);
104 operatorStack.push(token);
106 else if (token ==
OPEN)
107 operatorStack.push(token);
108 else if (token ==
CLOSE)
110 while (!operatorStack.empty() && operatorStack.top() !=
OPEN)
113 std::string operatorStr = operatorStack.top();
116 std::shared_ptr<Expression> operatorPtr(
new Expression(operatorStr));
118 if (outputStack.size() < 1)
120 std::shared_ptr<Expression> right = outputStack.top();
122 if (operatorStr ==
NOT)
124 operatorPtr->setLeft(right, operatorPtr);
125 outputStack.push(operatorPtr);
129 if (outputStack.size() < 1)
131 std::shared_ptr<Expression> left = outputStack.top();
134 operatorPtr->setLeft(left, operatorPtr);
135 operatorPtr->setRight(right, operatorPtr);
137 outputStack.push(operatorPtr);
142 if (!operatorStack.empty() && operatorStack.top() ==
NOT)
144 while (!operatorStack.empty() && operatorStack.top() ==
NOT)
146 std::string operatorStr = operatorStack.top();
149 if (outputStack.size() < 1)
152 std::shared_ptr<Expression> operand = outputStack.top();
155 std::shared_ptr<Expression> operatorPtr(
new Expression(operatorStr));
157 operatorPtr->setLeft(operand, operatorPtr);
158 outputStack.push(operatorPtr);
163 while (!operatorStack.empty())
165 std::string operatorStr = operatorStack.top();
168 std::shared_ptr<Expression> operatorPtr(
new Expression(operatorStr));
170 if (outputStack.size() < 1)
172 std::shared_ptr<Expression> right = outputStack.top();
174 if (operatorStr ==
NOT)
176 operatorPtr->setLeft(right, operatorPtr);
177 outputStack.push(operatorPtr);
181 if (outputStack.size() < 1)
183 std::shared_ptr<Expression> left = outputStack.top();
186 operatorPtr->setLeft(left, operatorPtr);
187 operatorPtr->setRight(right, operatorPtr);
189 outputStack.push(operatorPtr);
194 if (outputStack.size() != 1)
196 root = outputStack.top();