Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "evaluate_prefix.h"
- #include <bits/stdc++.h>
- Expression::Expression(std::string text) {
- mText = text;
- dubina = 0;
- mNextToken = 0;
- }
- Expression::Token Expression::getToken() {
- Expression::Token t;
- t.value = 0;
- while (mNextToken < mText.size() && mText[mNextToken] == ' ') mNextToken++;
- if (mNextToken == mText.size()) {
- throw std::runtime_error("nema vise tokena");
- }
- if (mText[mNextToken] == '+' || mText[mNextToken] == '-' || mText[mNextToken] == '^' || mText[mNextToken] == '*' || mText[mNextToken] == '/') {
- t.type = binaryOp;
- t.symbol = mText[mNextToken];
- mNextToken++;
- }
- else if (mText[mNextToken] == '~') {
- t.type = unaryOp;
- t.symbol = mText[mNextToken];
- mNextToken++;
- }
- else if (mText[mNextToken] >= '0' && mText[mNextToken] <= '9') {
- t.type = operand;
- while (mNextToken < mText.size() && mText[mNextToken] >= '0' && mText[mNextToken] <= '9') {
- t.value *= 10;
- t.value += mText[mNextToken] - '0';
- mNextToken++;
- }
- }
- else {
- throw std::runtime_error("nepoznati znak");
- }
- while (mNextToken < mText.size() && mText[mNextToken] == ' ') mNextToken++;
- return t;
- }
- Expression::Value Expression::evaluate() {
- dubina++;
- int ret;
- Expression::Token t = this->getToken();
- std::cout << dubina << " " << t.type << " " << t.symbol << ' ' << t.value << '\n';
- if (t.type == unaryOp) {
- ret = -(this->evaluate());
- }
- if (t.type == binaryOp) {
- if (t.symbol == '+') {
- ret = (this->evaluate()) + (this->evaluate());
- }
- else if (t.symbol == '-') {
- ret = (this->evaluate()) - (this->evaluate());
- }
- else if (t.symbol == '^') {
- int a = (this->evaluate());
- int b = (this->evaluate());
- int ret = 1;
- std::cout << "pote " << a << " " << b << '\n';
- while (b--) ret *= a;
- std::cout << "ret = " << ret << '\n';
- }
- else if (t.symbol == '*') {
- ret = (this->evaluate()) * (this->evaluate());
- }
- else if (t.symbol == '/') {
- ret = (this->evaluate()) / (this->evaluate());
- }
- std::cout << "ret = " << ret << '\n';
- }
- if (t.type == operand) {
- ret = t.value;
- }
- dubina--;
- std::cout << "dubina i ret " << dubina << " " << ret << '\n';
- if (!dubina && mNextToken != mText.size())
- throw std::runtime_error("previse znakova");
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement