diff --git a/lib/include/artichoke/Parser/Parser.hpp b/lib/include/artichoke/Parser/Parser.hpp index eb0f82a..eddba4e 100644 --- a/lib/include/artichoke/Parser/Parser.hpp +++ b/lib/include/artichoke/Parser/Parser.hpp @@ -40,6 +40,15 @@ namespace arti::lang { Expected parse(); + Expected + consume(TokenV type, std::string_view message); + + Expected + matchAndConsume(TokenV type); + + Expected + match(TokenV type, std::size_t offset = 0); + Expected> parseTopLevelDeclaration(); @@ -148,44 +157,6 @@ namespace arti::lang { Expected parseInfLoopStatement(); - Expected consume(TokenV type, std::string_view message) { - auto peeked = tokenizer.peekExpect(type, message); - - if (! peeked) { - return Unexpected<>{ std::move(peeked).error() }; - } - - std::ignore = tokenizer.consume(); - - return peeked; - } - - Expected matchAndConsume(TokenV type) { - auto peeked = tokenizer.peek(); - - if (! peeked) { - return Unexpected<>{ std::move(peeked).error() }; - } - - if (peeked->value != type) { - return false; - } - - std::ignore = tokenizer.consume(); - - return true; - } - - Expected match(TokenV type, std::size_t offset = 0) { - auto peeked = tokenizer.peek(offset); - - if (! peeked) { - return Unexpected<>{ std::move(peeked).error() }; - } - - return (peeked->value == type); - } - private: std::string unitName; std::string sourceCode; diff --git a/lib/src/Parser/Parser.cpp b/lib/src/Parser/Parser.cpp index 637d8e1..a701eb8 100644 --- a/lib/src/Parser/Parser.cpp +++ b/lib/src/Parser/Parser.cpp @@ -64,4 +64,42 @@ namespace arti::lang { return unit; } + Expected Parser::consume(TokenV type, std::string_view message) { + auto peeked = tokenizer.peekExpect(type, message); + + if (! peeked) { + return Unexpected<>{ std::move(peeked).error() }; + } + + std::ignore = tokenizer.consume(); + + return peeked; + } + + Expected Parser::matchAndConsume(TokenV type) { + auto peeked = tokenizer.peek(); + + if (! peeked) { + return Unexpected<>{ std::move(peeked).error() }; + } + + if (peeked->value != type) { + return false; + } + + std::ignore = tokenizer.consume(); + + return true; + } + + Expected Parser::match(TokenV type, std::size_t offset) { + auto peeked = tokenizer.peek(offset); + + if (! peeked) { + return Unexpected<>{ std::move(peeked).error() }; + } + + return (peeked->value == type); + } + } // namespace arti::lang diff --git a/lib/src/Parser/Types.cpp b/lib/src/Parser/Types.cpp index c354de0..4d17bcf 100644 --- a/lib/src/Parser/Types.cpp +++ b/lib/src/Parser/Types.cpp @@ -22,8 +22,6 @@ #include -#include - namespace arti::lang { Expected Parser::parseNamespacedIdentifier() {