From 558e0191ba5a5b0ab99825de7d7d2219387e559e Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Sat, 19 Apr 2025 18:36:42 +0000
Subject: [PATCH] constats variable type implementation

---
 src/Parser/Parser.cpp |   63 ++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp
index 7eabca3..d475d46 100644
--- a/src/Parser/Parser.cpp
+++ b/src/Parser/Parser.cpp
@@ -53,6 +53,35 @@
     { Lexer::Tokens::Type::KEYWORD_OBJECT,  Symbols::Variables::Type::OBJECT    },
 };
 
+// Parse a top-level constant variable definition: const <type> $name = expr;
+void Parser::parseConstVariableDefinition() {
+    // 'const'
+    auto constTok = expect(Lexer::Tokens::Type::KEYWORD, "const");
+    // Parse type
+    Symbols::Variables::Type var_type = parseType();
+    // Variable name
+    Lexer::Tokens::Token id_token;
+    if (currentToken().type == Lexer::Tokens::Type::VARIABLE_IDENTIFIER ||
+        currentToken().type == Lexer::Tokens::Type::IDENTIFIER) {
+        id_token = consumeToken();
+    } else {
+        reportError("Expected variable name after 'const'", currentToken());
+    }
+    std::string var_name = id_token.value;
+    if (!var_name.empty() && var_name[0] == '$') {
+        var_name = var_name.substr(1);
+    }
+    const auto ns = Symbols::SymbolContainer::instance()->currentScopeName();
+    // Expect assignment
+    expect(Lexer::Tokens::Type::OPERATOR_ASSIGNMENT, "=");
+    // Parse initializer expression
+    auto expr = parseParsedExpression(var_type);
+    // Record constant definition
+    Interpreter::OperationsFactory::defineConstantWithExpression(
+        var_name, var_type, std::move(expr), ns, current_filename_, id_token.line_number, id_token.column_number);
+    expect(Lexer::Tokens::Type::PUNCTUATION, ";");
+}
+
 void Parser::parseVariableDefinition() {
     Symbols::Variables::Type var_type = parseType();
 
@@ -365,11 +394,30 @@
         return std::make_unique<Interpreter::CallStatementNode>(funcName, std::move(exprs), this->current_filename_,
                                                                 idTok.line_number, idTok.column_number);
     }
+    // Constant variable declaration in blocks
+    if (currentToken().type == Lexer::Tokens::Type::KEYWORD && currentToken().value == "const") {
+        // 'const'
+        auto constTok = expect(Lexer::Tokens::Type::KEYWORD, "const");
+        // Parse type
+        Symbols::Variables::Type type = parseType();
+        // Variable name
+        auto idTok = expect(Lexer::Tokens::Type::VARIABLE_IDENTIFIER);
+        std::string name = idTok.value;
+        if (!name.empty() && name[0] == '$') name = name.substr(1);
+        // Assignment
+        expect(Lexer::Tokens::Type::OPERATOR_ASSIGNMENT, "=");
+        auto valExpr = parseParsedExpression(type);
+        expect(Lexer::Tokens::Type::PUNCTUATION, ";");
+        auto exprNode = buildExpressionFromParsed(valExpr);
+        return std::make_unique<Interpreter::DeclareVariableStatementNode>(
+            name, Symbols::SymbolContainer::instance()->currentScopeName(), type, std::move(exprNode),
+            this->current_filename_, idTok.line_number, idTok.column_number, /* isConst */ true);
+    }
     // Variable declaration
     if (Parser::variable_types.find(currentToken().type) != Parser::variable_types.end()) {
-        auto        type  = parseType();
-        auto        idTok = expect(Lexer::Tokens::Type::VARIABLE_IDENTIFIER);
-        std::string name  = idTok.value;
+        auto type  = parseType();
+        auto idTok = expect(Lexer::Tokens::Type::VARIABLE_IDENTIFIER);
+        std::string name = idTok.value;
         if (!name.empty() && name[0] == '$') {
             name = name.substr(1);
         }
@@ -381,9 +429,13 @@
             name, Symbols::SymbolContainer::instance()->currentScopeName(), type, std::move(exprNode),
             this->current_filename_, idTok.line_number, idTok.column_number);
     }
+    // Unexpected token in block
     reportError("Unexpected token in block");
     return nullptr;
 }
+// End of parseStatementNode
+// Parse next definition or statement
+// (Subsequent methods follow)
 
 void Parser::parseFunctionDefinition() {
     expect(Lexer::Tokens::Type::KEYWORD_FUNCTION_DECLARATION);
@@ -1015,6 +1067,11 @@
         return;
     }
 
+    // Constant variable definition
+    if (token_type == Lexer::Tokens::Type::KEYWORD && currentToken().value == "const") {
+        parseConstVariableDefinition();
+        return;
+    }
     // Variable definition if leading token matches a type keyword
     if (Parser::variable_types.find(token_type) != Parser::variable_types.end()) {
         parseVariableDefinition();

--
Gitblit v1.9.3