Initial Parser Implementation and Feature Completion #1

Merged
me merged 16 commits from parser-dev into main 2025-12-28 11:54:12 -06:00
3 changed files with 47 additions and 40 deletions
Showing only changes of commit 923b8d7e2d - Show all commits

View File

@ -40,6 +40,15 @@ namespace arti::lang {
Expected<ast::AST> parse();
Expected<Token>
consume(TokenV type, std::string_view message);
Expected<bool>
matchAndConsume(TokenV type);
Expected<bool>
match(TokenV type, std::size_t offset = 0);
Expected<ast::Optional<ast::TopLevelDeclNode>>
parseTopLevelDeclaration();
@ -148,44 +157,6 @@ namespace arti::lang {
Expected<ast::InfLoopStmtNode>
parseInfLoopStatement();
Expected<Token> 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<bool> 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<bool> 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;

View File

@ -64,4 +64,42 @@ namespace arti::lang {
return unit;
}
Expected<Token> 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<bool> 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<bool> 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

View File

@ -22,8 +22,6 @@
#include <artichoke/Parser/Parser.hpp>
#include <print>
namespace arti::lang {
Expected<ast::NamespacedIdentifierNode> Parser::parseNamespacedIdentifier() {