|
|
- #pragma once
- #include "lexer.h"
- #include <sstream>
- #include <stdexcept>
-
-
- namespace molasses {
- namespace details {
- template<typename... RestT>
- std::string concatenate_builder_impl(std::stringstream& stream)
- requires(sizeof...(RestT) == 0)
- {
- return stream.str();
- }
- template<typename FirstT, typename... RestT>
- std::string concatenate_builder_impl(std::stringstream& stream, FirstT first, RestT... rest) {
- stream << first;
- return concatenate_builder_impl(stream, rest...);
- }
- template<typename... RestT>
- std::string concatenate_builder(RestT... rest) {
- std::stringstream stream{};
- return concatenate_builder_impl(stream, rest...);
- }
- }
-
- struct build_system_error : std::runtime_error {
- explicit build_system_error(const std::string& message)
- : std::runtime_error(message) {}
- };
-
- struct interpreter_error : std::runtime_error {
- explicit interpreter_error(const std::string& message)
- : std::runtime_error(message) {}
- };
-
- struct parser_error : public std::runtime_error {
- explicit parser_error(const std::string& str)
- : std::runtime_error(str) {}
- };
-
- struct type_input_error : public parser_error {
- type_input_error()
- : parser_error("Bad type provided") {}
- // TODO: Better error message
- };
- struct value_missing_error : public parser_error {
- value_missing_error()
- : parser_error("Expected value, none provided") {}
- // TODO: Better error message
- };
- struct procedure_stack_error : public parser_error {
- procedure_stack_error()
- : parser_error("Expected the stack to look like the return stack upon completion\n") {}
- // TODO: Better error message
- };
- struct unexpected_token_error : public parser_error {
- unexpected_token_error(const symbol& sym, const std::string& found, const std::string& expected)
- : parser_error(details::concatenate_builder(
- "Unexpected token encountered\n", "\tAt ", sym.file_name, ":", sym.line, ":", sym.column, "\n",
- "\tExpected ", expected, "\n", "\tFound ", found, "\n"
- )) {}
- };
- struct expecting_token_error : public parser_error {
- expecting_token_error(const std::string& expected, const std::string& context)
- : parser_error(details::concatenate_builder(
- "An expected token has not been encountered before the end of the input\n", "\tExpected ", expected,
- "\n", "\t", context, "\n"
- )) {}
- // TODO: Better error message
- };
- struct unknown_token_error : public parser_error {
- explicit unknown_token_error(const symbol& sym)
- : parser_error(details::concatenate_builder(
- "An unknown token has been encountered\n", "\tAt ", sym.file_name, ":", sym.line, ":", sym.column,
- "\n"
- )) {}
- // TODO: Better error message
- };
- struct type_expected_with_modifier_error : public parser_error {
- type_expected_with_modifier_error()
- : parser_error("A type is expected before a modifier") {}
- // TODO: Better error message
- };
- }
|