/
thomas-king
/
SyntacticAnalyzer
Обзор
Документация
Войти
/
thomas-king
/
SyntacticAnalyzer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
include/Services/TokensParser.h
83 строки
2 KB
Ace Rodstin
Implement SyntacticAnalyzer.
06 апр 2023, 09:52
06 апр 2023, 09:52
2d58f4b
Код
Авторство
О чём код?
// // TokensParser.h // TokensParser // // Created by Ace Rodstin on 3/6/23. // Copyright © 2023 Ace Rodstin. All rights reserved. // #ifndef TOKENS_PARSER_HEADER_FILE #define TOKENS_PARSER_HEADER_FILE #include <string> #include "Services/CharacterManager.h" #include <optional> #include "Models/Token.h" #include "Models/NumberBase.h" #include "Models/Keyword.h" #include "Models/Operator.h" #include "Models/Punctuator.h" #include "Models/Literal.h" #include <map> #include <algorithm> using namespace std; namespace ace { class TokensParser { public: TokensParser(const string buffer); Token next(); private: using iterator = string::const_iterator; iterator currentPosition; iterator end; CharacterManager characterManager; optional<Token> formTextToken(); optional<Token> formNumberToken(); optional<Token> formPunctuatorToken(); optional<Token> formOperatorToken(); optional<Token> formStringToken(); optional<Token> formCharacterToken(); optional<Literal> parseDecimalNumberLiteral(); optional<Literal> parseHexadecimalNumberLiteral(); optional<Literal> parseNumberLiteral(string head, NumberBase base); optional<Literal> parseIntegerLiteral(NumberBase base); optional<string> parseNumberDigits(NumberBase base); optional<string> parseFraction(NumberBase base); optional<string> parseExponent(NumberBase base); string text(iterator tokenEnd); optional<Keyword> keyword(string text); optional<Operator> _operator(string text); optional<Punctuator> punctuator(string text); void advanceBySpaces(); void advanceBy(string text); void advanceBy(Operator op); void advanceBy(Punctuator punctuator); void advanceBy(int charactersCount); template<class T> optional<T> findIn(map<T, string> container, string value) { auto predicate = [&](auto pair) { return pair.second == value; }; auto found = find_if(container.begin(), container.end(), predicate); if (found == container.end()) { return {}; } else { auto pair = *found; return pair.first; } } }; } #endif