Util: Improve Lexer string tokenization
This commit is contained in:
+22
-16
@@ -178,40 +178,46 @@ 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 {
|
// Break on "\/ and any control character
|
||||||
std::string invalidCharacters = "{}[]:,";
|
std::string breakOnGrammar = "\"\\/";
|
||||||
if (invalidCharacters.find(check) != std::string::npos) {
|
for (size_t i = 0; i < 32; ++i) {
|
||||||
return false;
|
breakOnGrammar += i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
bool escape = false;
|
||||||
};
|
|
||||||
|
|
||||||
std::string symbol = "";
|
|
||||||
char character = consume();
|
char character = consume();
|
||||||
for (;;) {
|
for (;;) {
|
||||||
character = peek();
|
character = peek();
|
||||||
|
|
||||||
// TODO: Escape logic goes here
|
if (!escape && character == '\\') {
|
||||||
// ", \, /, b(ackspace), f(orm feed), l(ine feed), c(arriage return), t(ab), u(nicode) \u0021
|
symbol += '\\';
|
||||||
|
increment();
|
||||||
if (!isValidStringCharacter(character)) {
|
escape = true;
|
||||||
m_tokens->push_back({ Token::Type::None, m_line, column, "" });
|
continue;
|
||||||
m_job->printErrorLine(m_job->tokens()->back(), "strings should be wrapped in double quotes");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
if (character == '"') {
|
|
||||||
|
if (!escape && breakOnGrammar.find(character) != std::string::npos) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol += character;
|
symbol += character;
|
||||||
increment();
|
increment();
|
||||||
|
|
||||||
|
if (escape) {
|
||||||
|
escape = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Pushing -> String: \"%s\"\t%zu[%zu]\n", symbol.c_str(), m_line, column);
|
printf("Pushing -> String: \"%s\"\t%zu[%zu]\n", symbol.c_str(), m_line, column);
|
||||||
m_tokens->push_back({ Token::Type::String, m_line, column, symbol });
|
m_tokens->push_back({ Token::Type::String, m_line, column, symbol });
|
||||||
|
|
||||||
|
if (character != '"') {
|
||||||
|
m_job->printErrorLine(m_job->tokens()->back(), "strings should be wrapped in double quotes");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user