Browse Source

Util: Check strings for double quotes in Lexer

master
Riyyi 3 years ago
parent
commit
061ed74d4f
  1. 4
      src/util/json/job.cpp
  2. 18
      src/util/json/lexer.cpp

4
src/util/json/job.cpp

@ -33,6 +33,10 @@ Value Job::fire()
Lexer lexer(this); Lexer lexer(this);
lexer.analyze(); lexer.analyze();
if (!m_success) {
return { nullptr };
}
Parser parser(this); Parser parser(this);
Value value = parser.parse(); Value value = parser.parse();

18
src/util/json/lexer.cpp

@ -59,8 +59,6 @@ void Lexer::analyze()
break; break;
case '"': case '"':
if (!getString()) { if (!getString()) {
// Error!
printf("Invalid JSON!\n");
return; return;
} }
break; break;
@ -150,8 +148,17 @@ bool Lexer::consumeSpecific(char character)
bool Lexer::getString() bool Lexer::getString()
{ {
size_t column = m_column; 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(); char character = consume();
for (;;) { for (;;) {
character = peek(); character = peek();
@ -159,6 +166,11 @@ bool Lexer::getString()
// TODO: Escape logic goes here // TODO: Escape logic goes here
// ", \, /, b(ackspace), f(orm feed), l(ine feed), c(arriage return), t(ab), u(nicode) \u0021 // ", \, /, 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 == '"') { if (character == '"') {
break; break;
} }

Loading…
Cancel
Save