From abb075939fc9444d67fa598452e73d8b33d2f4ef Mon Sep 17 00:00:00 2001 From: Riyyi Date: Mon, 11 Jul 2022 19:08:30 +0200 Subject: [PATCH] Util: Properly detect empty Tokens and multiple root elements --- src/util/json/parser.cpp | 70 +++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/util/json/parser.cpp b/src/util/json/parser.cpp index 96cc5b0..5d3b541 100644 --- a/src/util/json/parser.cpp +++ b/src/util/json/parser.cpp @@ -36,40 +36,44 @@ Value Parser::parse() { Value result; - Token token; - while (m_index < m_tokens->size()) { - token = peek(); + if (m_tokens->size() == 0) { + m_job->printErrorLine({}, "expecting token, not 'EOF'"); + return result; + } - switch (token.type) { - case Token::Type::Literal: - result = getLiteral(); - break; - case Token::Type::Number: - result = getNumber(); - m_index++; - break; - case Token::Type::String: - result = getString(); - break; - case Token::Type::BracketOpen: - result = getArray(); - break; - case Token::Type::BraceOpen: - result = getObject(); - break; - case Token::Type::BracketClose: - m_job->printErrorLine(token, "expecting value, not ']'"); - m_index++; - break; - case Token::Type::BraceClose: - m_job->printErrorLine(token, "expecting string, not '}'"); - m_index++; - break; - default: - m_job->printErrorLine(token, "multiple root elements"); - m_index++; - break; - } + Token token = peek(); + switch (token.type) { + case Token::Type::Literal: + result = getLiteral(); + break; + case Token::Type::Number: + result = getNumber(); + break; + case Token::Type::String: + result = getString(); + break; + case Token::Type::BracketOpen: + result = getArray(); + break; + case Token::Type::BraceOpen: + result = getObject(); + break; + case Token::Type::BracketClose: + m_job->printErrorLine(token, "expecting value, not ']'"); + m_index++; + break; + case Token::Type::BraceClose: + m_job->printErrorLine(token, "expecting string, not '}'"); + m_index++; + break; + default: + m_job->printErrorLine(token, "multiple root elements"); + m_index++; + break; + } + + if (m_index < m_tokens->size()) { + m_job->printErrorLine(peek(), "multiple root elements"); } return result;