artichoke-lang/lib/src/Parser/Statements.cpp
erick-alcachofa b99f3586dc
chore(license): Added NOTICE header to all source files
Signed-off-by: erick-alcachofa <erick@artichoke.dev>
2025-12-25 13:12:41 -06:00

71 lines
2.9 KiB
C++

//============================================================================//
// //
// artichoke programming language //
// //
// Copyright (C) 2025 Erick Saul Guzman Ramos, whoami.artichoke.dev //
// //
// //
// This program is free software: you can redistribute it and/or modify //
// it under the terms of the GNU Affero General Public License as published //
// by the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU Affero General Public License for more details. //
// //
// You should have received a copy of the GNU Affero General Public License //
// along with this program. If not, see <https://www.gnu.org/licenses/>. //
// //
//============================================================================//
#include <artichoke/Parser/Parser.hpp>
namespace arti::lang {
Expected<ast::CodeBlockStmtNode> Parser::parseCodeBlock() {
auto node = ast::MakeNode<ast::CodeBlockStmtNode>();
auto stmt = ast::Optional<ast::StatementNode>{};
bool keepParsing = true;
if (auto lsquirly = consume(TokenV::opLSquirly, "'{'"); ! lsquirly) {
return Unexpected<>{ std::move(lsquirly).error() };
}
while (keepParsing) {
if (auto ok = parseStatement(); ok) {
stmt = std::move(ok).value();
if (! stmt.has_value()) {
keepParsing = false;
}
else {
node->statements.push_back(std::move(stmt).value());
}
}
else {
return Unexpected<>{ std::move(ok).error() };
}
}
if (auto rsquirly = consume(TokenV::opRSquirly, "'}'"); ! rsquirly) {
return Unexpected<>{ std::move(rsquirly).error() };
}
return node;
}
Expected<ast::Optional<ast::StatementNode>>
Parser::parseStatement() {
/* TODO: Implement statement parsing logic.
* This is intentionally stubbed while the parser architecture
* is being in development.
* Currently, the compiler is in a 'Declarations-Only' state. */
return std::nullopt;
}
} // namespace arti::lang