feat(tokenizer): add exceptions

This commit is contained in:
3lswear
2022-02-12 18:54:45 +03:00
parent 7df10265e0
commit 3a5879eb4d
3 changed files with 47 additions and 8 deletions

View File

@@ -35,7 +35,7 @@ namespace config
s_token current;
try { current = tokenizer.getToken(); }
catch (std::logic_error e)
catch (std::exception &e)
{
std::cerr << e.what() << std::endl;
return;
@@ -71,7 +71,7 @@ namespace config
{
s_token nextToken;
try { nextToken = tokenizer.getToken(); }
catch (std::logic_error e)
catch (std::exception &e)
{
std::cerr << e.what() << std::endl;
break;
@@ -158,7 +158,7 @@ namespace config
s_token current;
try { current = tokenizer.getToken(); }
catch (std::logic_error e)
catch (std::exception &e)
{
std::cerr << e.what() << std::endl;
return;
@@ -313,7 +313,7 @@ namespace config
{
s_token current;
try { current = tokenizer.getToken(); }
catch (std::logic_error e)
catch (std::exception &e)
{
std::cerr << e.what() << std::endl;
break;

View File

@@ -178,6 +178,8 @@ namespace config
token.value += c;
file.get(c);
}
if (token.value != "false")
throw InvalidToken(token.value);
file.seekg(-1, std::ios_base::cur);
}
@@ -189,12 +191,20 @@ namespace config
token.value += c;
file.get(c);
}
if (token.value != "true")
throw InvalidToken(token.value);
file.seekg(-1, std::ios_base::cur);
}
else if (c == 'n')
{
token.type = NIL;
file.seekg(3, std::ios_base::cur);
while (std::isalpha(c))
{
token.value += c;
file.get(c);
}
if (token.value != "null")
throw InvalidToken(token.value);
}
else if (c == ',')
token.type = COMMA;
@@ -237,9 +247,7 @@ namespace config
{
file.get(c);
if ((c == ' ') && !file.good())
{
throw std::logic_error("No more tokens!");
}
throw NoMoreTokens();
else if (!file.good())
return (c);
}

View File

@@ -59,6 +59,37 @@ namespace config
void rollBackToken();
void set_last(e_token type);
class NoMoreTokens: public std::exception
{
public:
virtual const char *what() const throw()
{
return ("No more tokens!");
}
};
class InvalidToken: public std::exception
{
protected:
std::string *msg;
public:
InvalidToken(const std::string &token)
{
msg = new std::string("Invalid token: '" + token + "'");
}
virtual const char *what() const throw()
{
return (msg->c_str());
}
virtual ~InvalidToken() throw()
{
delete msg;
}
};
};
/* struct s_token Tokenizer::getKey(void) */