diff --git a/src/util/json/job.cpp b/src/util/json/job.cpp index 461a00a..76024ce 100644 --- a/src/util/json/job.cpp +++ b/src/util/json/job.cpp @@ -33,6 +33,10 @@ Value Job::fire() Lexer lexer(this); lexer.analyze(); + if (!m_success) { + return { nullptr }; + } + Parser parser(this); Value value = parser.parse(); diff --git a/src/util/json/lexer.cpp b/src/util/json/lexer.cpp index 58d7cd6..b550dae 100644 --- a/src/util/json/lexer.cpp +++ b/src/util/json/lexer.cpp @@ -59,8 +59,6 @@ void Lexer::analyze() break; case '"': if (!getString()) { - // Error! - printf("Invalid JSON!\n"); return; } break; @@ -150,8 +148,17 @@ bool Lexer::consumeSpecific(char character) bool Lexer::getString() { size_t column = m_column; - std::string symbol = ""; + auto isValidStringCharacter = [](char check) -> bool { + std::string invalidCharacters = "{}[]:,"; + if (invalidCharacters.find(check) != std::string::npos) { + return false; + } + + return true; + }; + + std::string symbol = ""; char character = consume(); for (;;) { character = peek(); @@ -159,6 +166,11 @@ bool Lexer::getString() // TODO: Escape logic goes here // ", \, /, b(ackspace), f(orm feed), l(ine feed), c(arriage return), t(ab), u(nicode) \u0021 + if (!isValidStringCharacter(character)) { + m_tokens->push_back({ Token::Type::None, m_line, column, "" }); + m_job->printErrorLine(m_job->tokens()->back(), "strings should be wrapped in double quotes"); + return false; + } if (character == '"') { break; }