From 49a8dae0f3a6e589dfad65cbbf230137a7b67f4a Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 11 Jun 2026 22:11:09 +1200 Subject: feat: Started to add arrays Only supports arrays of ints so far --- src/json.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'src/json.cpp') diff --git a/src/json.cpp b/src/json.cpp index c566c2b..0232a8a 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -2,7 +2,6 @@ #include "tokenizer.h" #include -#include #include #include @@ -98,13 +97,13 @@ namespace TehJSON tokenizer.appendInput(s); std::vector stringTokens = tokenizer.tokenize(); - readFromTokens(stringTokens, 0); + readFromTokens(stringTokens); } - int JSON::readFromTokens(std::vector tokens, int pos) + void JSON::readFromTokens(std::vector tokens) { this->tokens = tokens; - tokenPos = pos; + tokenPos = 0; consume(TokenType::LBrace); while(nextTokenType() != TokenType::RBrace) @@ -114,31 +113,61 @@ namespace TehJSON consume(TokenType::Colon); switch(nextTokenType()) { - case TokenType::LBrace: tokenPos = children[childName.content].readFromTokens(tokens, tokenPos); break; + case TokenType::LBrace: + { + std::vector childTokens; + while(nextTokenType() != TokenType::RBrace) + { + childTokens.push_back(consume()); + } + childTokens.push_back(consume(TokenType::RBrace)); + children[childName.content].readFromTokens(childTokens); + break; + } case TokenType::StringLit: children[childName.content].set(consume(TokenType::StringLit).content); break; case TokenType::IntLit: children[childName.content].set(std::stoi(consume(TokenType::IntLit).content)); break; case TokenType::FloatLit: children[childName.content].set(std::stof(consume(TokenType::FloatLit).content)); break; + case TokenType::LSquare: + { + consume(TokenType::LSquare); + std::vector vec; + while(nextTokenType() != TokenType::RSquare) + { + if(nextTokenType() != TokenType::IntLit) + throw std::runtime_error("Only int arrays are supported so far"); + vec.push_back(std::stoi(consume(TokenType::IntLit).content)); + if(nextTokenType() == TokenType::Comma) + { + consume(TokenType::Comma); + } + } + consume(TokenType::RSquare); + children[childName.content].set(vec); + break; + }; default: throw std::runtime_error("Token type is not a literal!"); } if(nextTokenType() != TokenType::RBrace) consume(TokenType::Comma); } consume(TokenType::RBrace); - - return tokenPos; } // Serializers for basic types - template <> std::string TehJSON::JSON::serializeData(std::shared_ptr data) + template <> std::string TehJSON::JSON::serializeData(int *data) + { + return std::to_string(*data); + } + template <> std::string TehJSON::JSON::serializeData(float *data) { - return std::to_string(*static_cast(data.get())); + return std::to_string(*data); } - template <> std::string TehJSON::JSON::serializeData(std::shared_ptr data) + template <> std::string TehJSON::JSON::serializeData(std::string *data) { - return std::to_string(*static_cast(data.get())); + return '"' + *data + '"'; } - template <> std::string TehJSON::JSON::serializeData(std::shared_ptr data) + template <> std::string TehJSON::JSON::serializeData(bool *data) { - return '"' + *static_cast(data.get()) + '"'; + return (*data)?"true":"false"; } } -- cgit v1.2.3