/
thomas-king
/
IntegerParser
Обзор
Документация
Войти
/
thomas-king
/
IntegerParser
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/Parser.cpp
86 строк
2 KB
AceRodstin
Refactor parser.
02 янв 2023, 17:39
02 янв 2023, 17:39
e53dbcf
Код
Авторство
О чём код?
// // Parser.cpp // IntegerParser // // Created by Ace Rodstin on 30 Dec 2022. // #include "../include/Parser.h" #include "../include/Builder.h" using namespace Integer; class Parser::Error { public: enum class Reason { invalid_character }; Error(Reason reason) { this->reason = reason; } const char* what() { switch (reason) { case Reason::invalid_character: return "Invalid character"; } } private: Reason reason; }; int Parser::parse(string literal) { Builder builder {}; builder.configure(literal); try { auto literal = builder.build(); auto translation = translate(literal.get(), literal.base); return parse(translation, literal.base); } catch(invalid_argument exception) { throw Error { Error::Reason::invalid_character }; } } string Parser::translate(string literal, Base base) { stringstream buffer; for (auto character : literal) { // Remove _ characters if (character != '_') { buffer << character; } } auto translation = buffer.str(); switch (base) { case Base::octal: // Remove o character translation.erase(translation.begin() + 1); break; case Base::binary: // Remove 0b head translation.erase(translation.begin(), translation.begin() + 2); break; default: break; } return translation; } int Parser::parse(string translation, Base base) { switch (base) { case Base::decimal: return stoi(translation); case Base::hexadecimal: return stoi(translation, 0, 16); case Base::octal: return stoi(translation, 0, 8); case Base::binary: return stoi(translation, 0, 2); } }