Added simple escape character support
This commit is contained in:
parent
942c1e323b
commit
8258df216e
@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user