lerr_t and lerr_type_t -> Lexer::Err and Lexer::Err::Type

This commit is contained in:
2024-06-01 01:56:29 +01:00
parent 4b85f90a52
commit 7e9af309e3
5 changed files with 55 additions and 59 deletions

View File

@@ -42,8 +42,8 @@ namespace Lexer
return (src.size() > match.size() && src.substr(0, match.size()) == match);
}
pair<Token, lerr_t> tokenise_symbol(string_view &source, size_t &column,
size_t line)
pair<Token, Err> tokenise_symbol(string_view &source, size_t &column,
size_t line)
{
auto end = source.find_first_not_of(VALID_SYMBOL);
if (end == string::npos)
@@ -69,7 +69,7 @@ namespace Lexer
else if (sym[0] == '%')
{
return make_pair(
t, lerr_t(lerr_type_t::INVALID_PREPROCESSOR_DIRECTIVE, column, line));
t, Err(Err::Type::INVALID_PREPROCESSOR_DIRECTIVE, column, line));
}
else if (sym.size() > 1 && sym[0] == '$')
{
@@ -224,7 +224,7 @@ namespace Lexer
t.content = sym;
t.column = column;
column += sym.size() - 1;
return make_pair(t, lerr_t());
return make_pair(t, Err());
}
Token tokenise_literal_number(string_view &source, size_t &column)
@@ -266,22 +266,20 @@ namespace Lexer
return t;
}
pair<Token, lerr_t> tokenise_literal_char(string_view &source, size_t &column,
size_t &line)
pair<Token, Err> tokenise_literal_char(string_view &source, size_t &column,
size_t &line)
{
Token t{};
auto end = source.find('\'', 1);
if (source.size() < 3 || end == 1 || end > 3)
return make_pair(t,
lerr_t(lerr_type_t::INVALID_CHAR_LITERAL, column, line));
return make_pair(t, Err(Err::Type::INVALID_CHAR_LITERAL, column, line));
else if (source[1] == '\\')
{
// Escape sequence
char escape = '\0';
if (source.size() < 4 || source[3] != '\'')
return make_pair(
t, lerr_t(lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE, column,
line));
return make_pair(t, Err(Err::Type::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE,
column, line));
switch (source[2])
{
case 'n':
@@ -298,9 +296,8 @@ namespace Lexer
break;
default:
column += 2;
return make_pair(
t, lerr_t(lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE, column,
line));
return make_pair(t, Err(Err::Type::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE,
column, line));
break;
}
t = Token{Token::Type::LITERAL_CHAR, std::to_string(escape), column};
@@ -313,7 +310,7 @@ namespace Lexer
column += 3;
source.remove_prefix(3);
}
return make_pair(t, lerr_t());
return make_pair(t, Err());
}
Token tokenise_literal_string(string_view &source, size_t &column, size_t end)
@@ -326,7 +323,7 @@ namespace Lexer
return token;
}
lerr_t tokenise_buffer(string_view source, std::vector<Token *> &tokens)
Err tokenise_buffer(string_view source, std::vector<Token *> &tokens)
{
size_t column = 0, line = 1;
while (source.size() > 0)
@@ -371,14 +368,14 @@ namespace Lexer
{
auto end = source.find('\"', 1);
if (end == string::npos)
return lerr_t(lerr_type_t::INVALID_STRING_LITERAL, column, line);
return Err(Err::Type::INVALID_STRING_LITERAL, column, line);
t = tokenise_literal_string(source, column, end);
}
else if (first == '\'')
{
lerr_t lerr;
Err lerr;
std::tie(t, lerr) = tokenise_literal_char(source, column, line);
if (lerr.type != lerr_type_t::OK)
if (lerr.type != Err::Type::OK)
return lerr;
}
else if (isdigit(first) ||
@@ -388,7 +385,7 @@ namespace Lexer
if (end == string::npos)
end = source.size() - 1;
else if (end != string::npos && !(isspace(source[end])))
return lerr_t(lerr_type_t::INVALID_NUMBER_LITERAL, column, line);
return Err(Err::Type::INVALID_NUMBER_LITERAL, column, line);
t = tokenise_literal_number(source, column);
}
else if (first == '0' && source.size() > 2 && source[1] == 'x' &&
@@ -398,20 +395,20 @@ namespace Lexer
if (end == string::npos)
end = source.size() - 1;
else if (end != string::npos && !(isspace(source[end])))
return lerr_t(lerr_type_t::INVALID_NUMBER_LITERAL, column, line);
return Err(Err::Type::INVALID_NUMBER_LITERAL, column, line);
t = tokenise_literal_hex(source, column);
}
else if (is_char_in_s(first, VALID_SYMBOL))
{
lerr_t lerr;
Err lerr;
std::tie(t, lerr) = tokenise_symbol(source, column, line);
if (lerr.type != lerr_type_t::OK)
if (lerr.type != Err::Type::OK)
return lerr;
}
else
{
++column;
return lerr_t{lerr_type_t::UNKNOWN_LEXEME, column, line};
return Err{Err::Type::UNKNOWN_LEXEME, column, line};
}
if (is_token)
@@ -421,7 +418,7 @@ namespace Lexer
tokens.push_back(acc);
}
}
return lerr_t{};
return Err{};
}
std::ostream &operator<<(std::ostream &os, Token &t)
@@ -533,30 +530,30 @@ namespace Lexer
return "";
}
std::ostream &operator<<(std::ostream &os, lerr_t &lerr)
std::ostream &operator<<(std::ostream &os, Err &lerr)
{
os << lerr.line << ":" << lerr.col << ": ";
switch (lerr.type)
{
case lerr_type_t::OK:
case Err::Type::OK:
os << "OK";
break;
case lerr_type_t::INVALID_CHAR_LITERAL:
case Err::Type::INVALID_CHAR_LITERAL:
os << "INVALID_CHAR_LITERAL";
break;
case lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE:
case Err::Type::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE:
os << "INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE";
break;
case lerr_type_t::INVALID_STRING_LITERAL:
case Err::Type::INVALID_STRING_LITERAL:
os << "INVALID_STRING_LITERAL";
break;
case lerr_type_t::INVALID_NUMBER_LITERAL:
case Err::Type::INVALID_NUMBER_LITERAL:
os << "INVALID_NUMBER_LITERAL";
break;
case lerr_type_t::INVALID_PREPROCESSOR_DIRECTIVE:
case Err::Type::INVALID_PREPROCESSOR_DIRECTIVE:
os << "INVALID_PREPROCESSOR_DIRECTIVE";
break;
case lerr_type_t::UNKNOWN_LEXEME:
case Err::Type::UNKNOWN_LEXEME:
os << "UNKNOWN_LEXEME";
break;
default:
@@ -565,7 +562,7 @@ namespace Lexer
return os;
}
lerr_t::lerr_t(lerr_type_t type, size_t col, size_t line)
Err::Err(Err::Type type, size_t col, size_t line)
: col{col}, line{line}, type{type}
{}
} // namespace Lexer