better error reporting

This commit is contained in:
Robert Bendun 2022-05-02 15:13:12 +02:00
parent 43223e685e
commit 74f4393d6a
5 changed files with 45 additions and 8 deletions

View File

@ -2,8 +2,8 @@ MAKEFLAGS="-j $(grep -c ^processor /proc/cpuinfo)"
CXXFLAGS=-std=c++20 -Wall -Wextra -O2 -Werror=switch
CPPFLAGS=-Ilib/expected/ -Ilib/ut/ -Isrc/
Obj=bin/lexer.o \
bin/errors.o \
Obj=bin/errors.o \
bin/lexer.o \
bin/unicode.o
all: bin/musique bin/unit-tests

View File

@ -20,9 +20,30 @@ std::ostream& operator<<(std::ostream& os, Error const& err)
return os << "end of file\n";
case errors::Unrecognized_Character:
return os << "unrecognized charater 0x" << std::hex << err.invalid_character
<< "(char: '" << utf8::Print(err.invalid_character) << "')\n";
if (err.invalid_character) {
return os << "unrecognized charater U+" << std::hex << err.invalid_character
<< " (char: '" << utf8::Print{err.invalid_character} << "')\n";
} else {
return os << "unrecognized character\n";
}
}
return os << "unrecognized error type\n";
}
Error errors::unrecognized_character(u32 invalid_character)
{
Error err;
err.type = errors::Unrecognized_Character;
err.invalid_character = invalid_character;
return err;
}
Error errors::unrecognized_character(u32 invalid_character, Location location)
{
Error err;
err.type = errors::Unrecognized_Character;
err.invalid_character = invalid_character;
err.location = std::move(location);
return err;
}

View File

@ -40,7 +40,7 @@ auto Lexer::next_token() -> Result<Token>
return { Token::Type::Numeric, finish(), token_location };
}
return errors::Unrecognized_Character;
return errors::unrecognized_character(peek(), token_location);
}
auto Lexer::peek() const -> u32

View File

@ -9,6 +9,7 @@ std::string_view Source = R"musique(
tl::expected<void, Error> Main()
{
Lexer lexer{Source};
lexer.location.filename = "example.mq";
for (;;) {
auto token = Try(lexer.next_token());
@ -20,7 +21,7 @@ int main()
{
auto result = Main();
if (not result.has_value()) {
std::cerr << result.error() << std::endl;
std::cerr << result.error() << std::flush;
return 1;
}
}

View File

@ -61,18 +61,33 @@ struct Error
bool operator==(errors::Type);
};
namespace errors
{
Error unrecognized_character(u32 invalid_character);
Error unrecognized_character(u32 invalid_character, Location location);
}
template<typename T>
struct Result : tl::expected<T, Error>
{
using Storage = tl::expected<T, Error>;
constexpr Result() = default;
constexpr Result(errors::Type error) : tl::expected<T, Error>(tl::unexpected(Error { error }))
constexpr Result(errors::Type error)
: Storage(tl::unexpected(Error { error }))
{
}
constexpr Result(Error error)
: Storage(tl::unexpected(std::move(error)))
{
}
template<typename ...Args>
constexpr Result(Args&& ...args)
: tl::expected<T, Error>( T{ std::forward<Args>(args)... } )
: Storage( T{ std::forward<Args>(args)... } )
{
}
};