From 6cc2945c1d1e6ca7bad0542c79de423df5e2db8b Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Fri, 18 Apr 2025 18:13:29 +0000
Subject: [PATCH] implements object type
---
src/Parser/Parser.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp
index e1e9776..1739a20 100644
--- a/src/Parser/Parser.cpp
+++ b/src/Parser/Parser.cpp
@@ -6,6 +6,7 @@
#include "Lexer/Operators.hpp"
// Statements and expression building for conditional and block parsing
#include "Interpreter/ConditionalStatementNode.hpp"
+// #include "Interpreter/ForStatementNode.hpp" // removed until for-in loops are implemented
#include "Interpreter/CallStatementNode.hpp"
#include "Interpreter/DeclareVariableStatementNode.hpp"
#include "Interpreter/ReturnStatementNode.hpp"
@@ -34,6 +35,7 @@
{ "string", Lexer::Tokens::Type::KEYWORD_STRING },
{ "boolean", Lexer::Tokens::Type::KEYWORD_BOOLEAN },
{ "bool", Lexer::Tokens::Type::KEYWORD_BOOLEAN },
+ { "object", Lexer::Tokens::Type::KEYWORD_OBJECT },
// ... other keywords ...
};
@@ -44,6 +46,7 @@
{ Lexer::Tokens::Type::KEYWORD_STRING, Symbols::Variables::Type::STRING },
{ Lexer::Tokens::Type::KEYWORD_NULL, Symbols::Variables::Type::NULL_TYPE },
{ Lexer::Tokens::Type::KEYWORD_BOOLEAN, Symbols::Variables::Type::BOOLEAN },
+ { Lexer::Tokens::Type::KEYWORD_OBJECT, Symbols::Variables::Type::OBJECT },
};
void Parser::parseVariableDefinition() {
@@ -357,6 +360,51 @@
while (true) {
auto token = currentToken();
+ // Object literal: { key: value, ... }
+ if (token.type == Lexer::Tokens::Type::PUNCTUATION && token.value == "{") {
+ // Consume '{'
+ consumeToken();
+ std::vector<std::pair<std::string, ParsedExpressionPtr>> members;
+ // Parse members until '}'
+ if (!(currentToken().type == Lexer::Tokens::Type::PUNCTUATION && currentToken().value == "}")) {
+ while (true) {
+ // Optional type tag before key
+ Symbols::Variables::Type memberType = Symbols::Variables::Type::UNDEFINED_TYPE;
+ if (Parser::variable_types.find(currentToken().type) != Parser::variable_types.end()) {
+ memberType = parseType();
+ }
+ // Key must be an identifier or variable identifier
+ if (currentToken().type != Lexer::Tokens::Type::IDENTIFIER &&
+ currentToken().type != Lexer::Tokens::Type::VARIABLE_IDENTIFIER) {
+ reportError("Expected identifier for object key");
+ }
+ std::string key = currentToken().value;
+ // Strip '$' if present
+ if (!key.empty() && key[0] == '$') {
+ key = key.substr(1);
+ }
+ consumeToken();
+ // Expect ':' delimiter
+ expect(Lexer::Tokens::Type::PUNCTUATION, ":");
+ // Parse value expression (pass tag type if provided)
+ Symbols::Variables::Type expectType = (memberType == Symbols::Variables::Type::UNDEFINED_TYPE)
+ ? Symbols::Variables::Type::NULL_TYPE
+ : memberType;
+ auto valueExpr = parseParsedExpression(expectType);
+ members.emplace_back(key, std::move(valueExpr));
+ if (match(Lexer::Tokens::Type::PUNCTUATION, ",")) {
+ continue;
+ }
+ break;
+ }
+ }
+ // Expect closing '}'
+ expect(Lexer::Tokens::Type::PUNCTUATION, "}");
+ // Create object literal parsed expression
+ output_queue.push_back(ParsedExpression::makeObject(std::move(members)));
+ expect_unary = false;
+ continue;
+ }
if (token.type == Lexer::Tokens::Type::PUNCTUATION && token.lexeme == "(") {
operator_stack.push("(");
--
Gitblit v1.9.3