71 lines
2.9 KiB
C++
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
|