Added simple escape character support

This commit is contained in:
Bobby Lucero 2023-06-02 14:43:33 -04:00
parent 942c1e323b
commit 8258df216e
2 changed files with 53 additions and 5 deletions

View File

@ -80,4 +80,6 @@ private:
char peekNext(); char peekNext();
void advance(int by = 1); void advance(int by = 1);
std::string parseEscapeCharacters(const std::string &input);
}; };

View File

@ -142,15 +142,25 @@ std::vector<Token> Lexer::Tokenize(std::string source){
} }
else if(t == '"') else if(t == '"')
{ {
bool last_was_escape = false;
std::string str; std::string str;
advance(); advance();
while(!src.empty() && src[0] != '"')
{
if(src[0] == '\n') line++; while(!src.empty())
str += src[0]; {
std::string next_c = std::string(1, src[0]);
if(next_c == "\"") break;
if(next_c == "\\")
{
advance();
next_c = "\\" + std::string(1, src[0]);
}
if(next_c == "\n") line++;
str += next_c;
advance(); advance();
} }
if(src.empty()) if(src.empty())
{ {
throw std::runtime_error("LEXER: Unterminated string at line: " + std::to_string(this->line)); throw std::runtime_error("LEXER: Unterminated string at line: " + std::to_string(this->line));
@ -159,7 +169,10 @@ std::vector<Token> Lexer::Tokenize(std::string source){
{ {
advance(); advance();
tokens.push_back(Token{STRING, str, line});
std::string escaped_str = parseEscapeCharacters(str);
tokens.push_back(Token{STRING, escaped_str, line});
} }
@ -311,4 +324,37 @@ char Lexer::peekNext()
return '\0'; return '\0';
} }
std::string Lexer::parseEscapeCharacters(const std::string& input) {
std::string output;
bool escapeMode = false;
for (char c : input) {
if (escapeMode) {
switch (c) {
case 'n':
output += '\n';
break;
case 't':
output += '\t';
break;
case '"':
output += '\"';
break;
case '\\':
output += '\\';
break;
default:
throw runtime_error("Invalid escape character: " + std::string(1, c));
}
escapeMode = false;
} else if (c == '\\') {
escapeMode = true;
} else {
output += c;
}
}
return output;
}