opuntiaOS - an operating system targeting x86 and ARMv7
at master 1.3 kB view raw
1/* 2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors. 3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com> 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9#include <cassert> 10#include <libfoundation/json/Parser.h> 11#include <unistd.h> 12 13namespace LFoundation::Json { 14 15StringObject* Parser::parse_string() 16{ 17 auto* res = new StringObject(); 18 19 m_lexer.skip_spaces(); 20 assert(m_lexer.eat_token('\"')); 21 m_lexer.eat_string(res->data()); 22 assert(m_lexer.eat_token('\"')); 23 return res; 24} 25 26DictObject* Parser::parse_dict() 27{ 28 auto* res = new DictObject(); 29 30 m_lexer.skip_spaces(); 31 assert(m_lexer.eat_token('{')); 32 for (;;) { 33 auto left = parse_string(); 34 assert(m_lexer.eat_token(':')); 35 auto right_obj = parse_object(); 36 res->data()[left->data()] = right_obj; 37 38 if (m_lexer.lookup_char() == ',') { 39 assert(m_lexer.eat_token(',')); 40 } else { 41 break; 42 } 43 } 44 assert(m_lexer.eat_token('}')); 45 return res; 46} 47 48Object* Parser::parse_object() 49{ 50 m_lexer.skip_spaces(); 51 switch (m_lexer.lookup_char()) { 52 case '{': 53 return parse_dict(); 54 case '\"': 55 return parse_string(); 56 default: 57 assert(false); 58 } 59 return new DictObject(); 60} 61 62}