From 70fcce6d115d9da8144a3c02050c644b250b4976 Mon Sep 17 00:00:00 2001 From: Lauchmelder Date: Sat, 29 Sep 2018 22:50:11 +0200 Subject: [PATCH] Add files via upload --- CAS.exe | Bin 0 -> 31744 bytes Console.cpp | 35 +++++++ Console.hpp | 30 ++++++ Error.hpp | 18 ++++ Interpreter.cpp | 242 ++++++++++++++++++++++++++++++++++++++++++++++++ Interpreter.hpp | 28 ++++++ Token.hpp | 161 ++++++++++++++++++++++++++++++++ main.cpp | 12 +++ 8 files changed, 526 insertions(+) create mode 100644 CAS.exe create mode 100644 Console.cpp create mode 100644 Console.hpp create mode 100644 Error.hpp create mode 100644 Interpreter.cpp create mode 100644 Interpreter.hpp create mode 100644 Token.hpp create mode 100644 main.cpp diff --git a/CAS.exe b/CAS.exe new file mode 100644 index 0000000000000000000000000000000000000000..ac2aa94dbd1b7582c62bdd66c00f8ef6ace6401f GIT binary patch literal 31744 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 Uq)*WoLTB3b`^n|~>jMe=KV=W%-v9sr literal 0 HcmV?d00001 diff --git a/Console.cpp b/Console.cpp new file mode 100644 index 0000000..5dbdb66 --- /dev/null +++ b/Console.cpp @@ -0,0 +1,35 @@ +#include "Console.hpp" +#include "Interpreter.hpp" + +#include +#include + +char* Console::input = new char[INPUT_BUFFER_SIZE]; + + +void Console::run() +{ + while (true) // Main loop, runs until process is terminated + { + awaitInput(); // Waits for input + handleInput(); // Handles input + } + + delete[] input; // After process is terminated, release the pointer +} + + + +void Console::awaitInput() +{ + std::cout << ">>>"; + std::cin >> std::setw(INPUT_BUFFER_SIZE) >> input; // Await input +} + + + +void Console::handleInput() +{ + double result = Interpreter::interpret(input); + std::cout << result << std::endl << std::endl; +} diff --git a/Console.hpp b/Console.hpp new file mode 100644 index 0000000..3ac54b5 --- /dev/null +++ b/Console.hpp @@ -0,0 +1,30 @@ +#pragma once + +const constexpr unsigned int INPUT_BUFFER_SIZE = 256; + +class Console +{ +public: + /////////////////////////////////////////////////////////// + /// \brief Calls every important process functions + /// + /////////////////////////////////////////////////////////// + static void run(); + +private: + static char* input; + + /////////////////////////////////////////////////////////// + /// \brief Waits for user input and writes it into a variable + /// + /////////////////////////////////////////////////////////// + static void awaitInput(); + + + /////////////////////////////////////////////////////////// + /// \brief Takes input and manages it + /// + /////////////////////////////////////////////////////////// + static void handleInput(); +}; + diff --git a/Error.hpp b/Error.hpp new file mode 100644 index 0000000..0c1c596 --- /dev/null +++ b/Error.hpp @@ -0,0 +1,18 @@ +#pragma once +#include + +#define INTERPRETER_ERROR std::cout << "+++ INTERPRETER: " +#define INTEGER_ERROR std::cout << "+++ INTEGER: " +#define MATHEMATICAL_ERROR std::cout << "+++ MATH: " + +#define UNKNOWN_CHAR_ERROR(x) INTERPRETER_ERROR << "Unknown character <" << (x) << "> found in string +++" << std::endl; return false +#define SYMBOL_LIST_ERROR INTERPRETER_ERROR << "Failed to create Symbol list +++" << std::endl; return false +#define TOKEN_LIST_ERROR INTERPRETER_ERROR << "Failed to create Token list +++" << std::endl; return false +#define TOO_MANY_OPERATORS INTERPRETER_ERROR << "Found multiple operators in sequence +++" << std::endl; return false +#define ILLEGAL_OPERATOR_POSITION INTERPRETER_ERROR << "An operator was found in an illegal position +++" << std::endl; return false + +#define INTEGER_TOO_BIG(x) INTEGER_ERROR << "Integer <" << (x) << "> cannot be converted to int +++" << std::endl; return false; +#define ENDS_ON_DECIMAL_POINT INTEGER_ERROR << "Integers cannot end with a decimal point +++" << std::endl; return false + +#define DIVIDE_BY_ZERO MATHEMATICAL_ERROR << "Division by zero +++" << std::endl; return false +#define IMAGINARY_NUMBERS MATHEMATICAL_ERROR << "Imaginary numbers are not supported +++" << std::endl; return false \ No newline at end of file diff --git a/Interpreter.cpp b/Interpreter.cpp new file mode 100644 index 0000000..a4f6318 --- /dev/null +++ b/Interpreter.cpp @@ -0,0 +1,242 @@ +#include "Interpreter.hpp" +#include "Error.hpp" + +#include + +double Interpreter::result = 0; +bool Interpreter::justNumber = false; +std::string Interpreter::numbers = "0123456789Aa.,"; +std::string Interpreter::operators = "+-*/^_"; +std::string Interpreter::string = ""; +std::map Interpreter::operation_order = { + {'+', 0}, + {'-', 0}, + {'*', 1}, + {'/', 1}, + {'^', 2}, + {'_', 2} +}; + +double Interpreter::interpret(char * _string) +{ + string = _string; + justNumber = false; + + if (!scanForErrors()) + return NULL; + + if (!getResult()) + return NULL; + + if (justNumber) + { + return result; + } + + return result; +} + + +bool Interpreter::scanForErrors() +{ + for (char c : string) + { + if (std::find(std::begin(numbers), std::end(numbers), c) == std::end(numbers) && + std::find(std::begin(operators), std::end(operators), c) == std::end(operators)) + { + UNKNOWN_CHAR_ERROR(c); + } + } + + return true; +} + +bool Interpreter::getResult() +{ + std::vector symbols; + if (!createSymbolList(symbols)) { + SYMBOL_LIST_ERROR; + } + + if (justNumber) + { + return true; + } + + std::vector tokens; + if (!createOrderedTokenList(symbols, tokens)) { + TOKEN_LIST_ERROR; + } + + result = tokens[tokens.size() - 1]->value(); + + return true; +} + +bool Interpreter::createSymbolList(std::vector& symbols) +{ + bool number = false; + bool hasOperator = false; + std::string num = ""; + + for (char c : string) + { + if (std::find(std::begin(numbers), std::end(numbers), c) != std::end(numbers)) + { + if (c == 'A' || c == 'a') + { + //printf("%f", result); + symbols.push_back(new Number(result)); + } + if (c == '.' || c == ',') + { + num += '.'; + } + else + { + num += c; + } + number = true; + } + + if (std::find(std::begin(operators), std::end(operators), c) != std::end(operators)) + { + hasOperator = true; + if (number == true) + { + //std::cout << "++++++++++++" << num << "++++++++++++++" << std::endl; + if (num != "") + { + try + { + if (number == true) symbols.push_back(new Number(std::stod(num))); + } + catch (...) + { + INTEGER_TOO_BIG(num); + } + } + symbols.push_back(new Operator(c)); + number = false; + num = ""; + } + else + { + if (c == '-') + { + number = true; + num += c; + } + else { + TOO_MANY_OPERATORS; + } + } + + } + } + + if (number != true) + { + ILLEGAL_OPERATOR_POSITION; + } + + if (num != "") + { + try + { + if (number == true) symbols.push_back(new Number(std::stod(num))); + } + catch (...) + { + INTEGER_TOO_BIG(num); + } + } + + if (!hasOperator) + { + justNumber = true; + result = symbols[0]->value(); + return true; + } + + return true; +} + +bool Interpreter::createOrderedTokenList(std::vector symbols, std::vector& tokens) +{ + //std::cout << operation_order.find(43)->second << std::endl; + + while (true) + { + int currentOperation = 0; + bool foundOperator = false; + + for (int i = 0; i < symbols.size(); i++) + { + if (!symbols[i]->isNumber()) + { + if (currentOperation == 0) + currentOperation = i; + + foundOperator = true; + if (operation_order.find((char)symbols[i]->value())->second > operation_order.find((char)symbols[currentOperation]->value())->second) + currentOperation = i; + } + } + + if (foundOperator) + { + switch ((int)symbols[currentOperation]->value()) + { + case '+': + tokens.push_back(new AddToken(symbols[currentOperation - 1]->value(), symbols[currentOperation + 1]->value())); + break; + + case '-': + tokens.push_back(new SubToken(symbols[currentOperation - 1]->value(), symbols[currentOperation + 1]->value())); + break; + + case '*': + tokens.push_back(new MulToken(symbols[currentOperation - 1]->value(), symbols[currentOperation + 1]->value())); + break; + + case '/': + if (symbols[currentOperation + 1]->value() == 0) { + DIVIDE_BY_ZERO; + } + tokens.push_back(new DivToken(symbols[currentOperation - 1]->value(), symbols[currentOperation + 1]->value())); + break; + + case '^': + tokens.push_back(new ExpToken(symbols[currentOperation - 1]->value(), symbols[currentOperation + 1]->value())); + break; + + case '_': + if (symbols[currentOperation - 1]->value() == 0) { + DIVIDE_BY_ZERO; + } + if (symbols[currentOperation + 1]->value() < 0) { + IMAGINARY_NUMBERS; + } + + tokens.push_back(new RootToken(symbols[currentOperation - 1]->value(), symbols[currentOperation + 1]->value())); + break; + + default: + + break; + } + + symbols.erase(symbols.begin() + currentOperation + 1); + symbols[currentOperation] = new Number(tokens[tokens.size() - 1]->value()); + symbols.erase(symbols.begin() + currentOperation - 1); + } + else { + break; + } + + foundOperator = false; + } + + return true; +} \ No newline at end of file diff --git a/Interpreter.hpp b/Interpreter.hpp new file mode 100644 index 0000000..d0e52c0 --- /dev/null +++ b/Interpreter.hpp @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include + +#include "Token.hpp" + +class Interpreter +{ +public: + static double interpret(char* _string); + +private: + static bool scanForErrors(); + static bool getResult(); + + static bool createSymbolList(std::vector& symbols); + static bool createOrderedTokenList(std::vector symbols, std::vector& tokens); + + static std::string string; + static std::string numbers; + static std::string operators; + static std::map operation_order; + + static double result; + static bool justNumber; +}; + diff --git a/Token.hpp b/Token.hpp new file mode 100644 index 0000000..cb53a13 --- /dev/null +++ b/Token.hpp @@ -0,0 +1,161 @@ +#pragma once +#include + +///////////////////////////////////////////////////// +/// \brief Abstract Token base class +/// +/// A token contains an operation - this means it will +/// hold two numbers, as well as their result after +/// the according operation. +/// +///////////////////////////////////////////////////// + +class Token +{ +public: + virtual bool nonCharToken() = 0; +}; + + + + + + + + +class NonChar : public Token +{ +public: + bool nonCharToken() override { return true; } + double value() { return result; } + +protected: + double a, b, result; +}; + + + +class Symbol : public Token +{ +public: + bool nonCharToken() override { return false; } + virtual bool isNumber() = 0; + virtual double value() = 0; +}; + + + + +class Operator : public Symbol +{ +public: + Operator(char _c) + { + c = _c; + } + + bool isNumber() override { return false; } + double value() { return c; } + +private: + char c; +}; + + +class Number : public Symbol +{ +public: + Number(double _i) + { + i = _i; + } + + bool isNumber() override { return true; } + double value() { return i; } + +private: + double i; +}; + + + + +class AddToken : public NonChar +{ +public: + AddToken(double _a, double _b) + { + a = _a; + b = _b; + + result = a + b; + } +}; + + + +class SubToken : public NonChar +{ +public: + SubToken(double _a, double _b) + { + a = _a; + b = _b; + + result = a - b; + } +}; + + + +class MulToken : public NonChar +{ +public: + MulToken(double _a, double _b) + { + a = _a; + b = _b; + + result = a * b; + } +}; + + +class DivToken : public NonChar +{ +public: + DivToken(double _a, double _b) + { + a = _a; + b = _b; + + result = a / b; + } +}; + + + +class ExpToken : public NonChar +{ +public: + ExpToken(double _a, double _b) + { + a = _a; + b = _b; + + result = pow(a, b); + } +}; + + +class RootToken : public NonChar +{ +public: + RootToken(double _a, double _b) + { + a = _a; + b = _b; + + result = pow(b, 1.0 / a); + } +}; \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..11bd710 --- /dev/null +++ b/main.cpp @@ -0,0 +1,12 @@ +#include "Console.hpp" +#include "Token.hpp" + +#include "Error.hpp" + + +int main() +{ + Console::run(); + + return 0; +} \ No newline at end of file